У меня есть следующая программа, которая должна быть простой для всех, кроме меня!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.
Установка 'b' к - 99, а затем распечатать его так, чтобы это вызвало undefi ая AFAIK. Кроме того, порядок, в котором вычисляется каждое из выражений, не задано, вызывает больше проблем. В принципе, единственная опасная, но безопасная вещь здесь была бы единственным 'cout << ((a = -b)? B: (b = -99)) << '\ n';' если я прав. – chris
@chris вы правы, 'operator <<' не создает точку последовательности, поэтому части «a» и «b» могут выполняться перед тройным предложением, но я считаю, что это поведение, определяемое реализацией, а не неопределенное поведение. – bcrist
@bcrist, Не исполнять (как в печатном виде), но, возможно, оценивать, да. И если одна печать 'a' оценивается до того, как' a' присваивается значение, UB, из-за чтения из неинициализированной переменной. И если одна печатная 'b' оценивается после тройной, UB из-за отсутствия последовательности, так как последний раз был изменен« b ». Однако сама настройка оценки не определена, но не определяется поведением. – chris