2017-02-01 20 views
-3
int a = 1, b = 2; 
int c = a*b + b==0; // c = 0 
cout << a*b + b==0; // outputs 4 

c вычисляется в 0, потому что оператор старшинство * и + операторов выше, чем == в результате которого c существу принимает значение (a*b+b)==0 который является ложным.C++ приоритет операторов в выходном потоке

Почему добавление такого же выражения в вывод cout 4?

+0

Потому что << имеет свой приоритет, который * выше *, чем у ==. –

+0

Любая хорошая книга или документ о C++ содержит список операторов с приоритетом ... –

ответ

4

Поскольку precedence этих операторов operator*>operator+>operator<<>operator==. Затем cout << a*b + b==0; эквивалентен (cout << ((a*b) + b)) == 0;.

Тогда результат ((a*b) + b)), т.е. 4 будет распечатан, то возвращаемое значение (cout << ((a*b) + b)), т.е. cout сравнивается с 0. До C++ 11 cout может быть неявно преобразован в void* через operator void*, который возвращает нулевой указатель, если у steram есть ошибки. Таким образом, здесь он сравнивается с 0 (т. Е. Нулевым указателем) и больше ничего не делает с результатом.

-2

answr by @songyuanyao уже объясняет поведение кода.

Я хочу ответить на ОП, сказав, что гораздо проще написать код, который легко поддается наблюдению.

Если вы не можете четко видеть логику выражения, упростите его. Используйте скобки, чтобы их было легче понять. Если вы не пишете код для обфускации кода, нет никакого оправдания для написания такого кода.

Transform эти строки

int c = a*b + b==0; // c = 0 

в

int c = (a*b) + (b==0); 

или

int c = ((a*b + b) == 0); 

в зависимости от вашего намерения.

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