2014-01-18 5 views
1

У меня есть следующая программа, которая должна быть простой для всех, кроме меня!C++ ternary operator confusion

#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

b is -99

В первом сегменте кода я понимаю, что a дано значение -b, 0, поэтому оно становится ложным, поэтому выполняется b = -99. Я не могу понять второй сегмент кода, где a = -b не имеет круглых скобок, почему a дано значение -99.

+1

Установка 'b' к - 99, а затем распечатать его так, чтобы это вызвало undefi ая AFAIK. Кроме того, порядок, в котором вычисляется каждое из выражений, не задано, вызывает больше проблем. В принципе, единственная опасная, но безопасная вещь здесь была бы единственным 'cout << ((a = -b)? B: (b = -99)) << '\ n';' если я прав. – chris

+0

@chris вы правы, 'operator <<' не создает точку последовательности, поэтому части «a» и «b» могут выполняться перед тройным предложением, но я считаю, что это поведение, определяемое реализацией, а не неопределенное поведение. – bcrist

+0

@bcrist, Не исполнять (как в печатном виде), но, возможно, оценивать, да. И если одна печать 'a' оценивается до того, как' a' присваивается значение, UB, из-за чтения из неинициализированной переменной. И если одна печатная 'b' оценивается после тройной, UB из-за отсутствия последовательности, так как последний раз был изменен« b ». Однако сама настройка оценки не определена, но не определяется поведением. – chris

ответ

1
(a = --b ? b : (b = -99)) 

здесь, потому что = и ? имеют the same priority (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) 
+0

Спасибо, сэр, дал понять! – 101

+0

;) Совершенно, я очень рад, что помог – 4pie0

5

Это связано с тем, что = имеет такой приоритет, как ?: (C++ operator priorities). В этом случае и потому, что они имеют ассоциацию справа налево, они оцениваются справа налево. Поэтому сначала выражение --b ? b : (b = -99) оценивается в -99, а затем оно назначается a.

+0

Я обязательно буду проверять приоритеты, нужно лучше их узнать. Спасибо за головы, хотя. – 101

1

Тернарный оператор имеет ассоциативность слева направо и имеет тот же приоритет, что и присваивание, что означает, что термин условия второй сегмент интерпретируется как a = (-b? B: (b = -99))

+0

Спасибо, круглые скобки действительно имеют значение – 101

Смежные вопросы