C++ тернарный оператор путаница
У меня есть следующая программа, которая должна быть простой для всех, кроме меня!
#include <iostream>
using namespace std;
int main()
{
int a, b;
b = 1;
cout << ((a = --b) ? b : (b = -99)) << '\n' << "a is " << a << '\n' << "b is " << b << endl;
b = 1;
cout << (a = --b ? b : (b = -99)) << '\n' << "a is " << a << '\n' << "b is " << b << endl;
}
Выход программы:
-99
а 0
б -99
-99
это -99
б -99
В первом сегменте кода я понимаю, что a задается значение -b, 0, поэтому оно становится ложным, поэтому выполняется b=-99. Я не могу понять второй сегмент кода, где a=- b не содержит скобок, почему a получает значение -99.
3 ответа
(a = --b ? b : (b = -99))
здесь, потому что =
а также ?
имеют одинаковый приоритет (15 по предоставленной ссылке) и оцениваются справа налево, выполняется следующим образом:
a = --b ? b : (b = -99)
1. --b ( =0)
2. 0?
3. 0 so not what is immediately after ? but what is after :
4. b=-99 (evaluate second expression)
5. a = -99 (assign the result of expression)
Это потому что =
имеет тот же приоритет, что и ?:
( Приоритеты операторов C++). В таком случае, и поскольку они имеют ассоциативность справа налево, они оцениваются справа налево. Итак, сначала выражение --b ? b : (b = -99)
оценивается в -99
а затем он назначается a
,
Тернарный оператор имеет ассоциативность справа налево и тот же приоритет, что и присваивание, что означает, что условие условия второго сегмента интерпретируется как a = ( --b? B: (b = -99))