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))

Другие вопросы по тегам