Странная оценка логического выражения

почему значение следующего выражения ложно?

bool a = false;
bool b= true;
std::cout<< a || !b && !a || b;

и почему значение меняется при добавлении скобок

bool a = false;
bool b= true;

std::cout<< (a || !b && !a || b);

Не следует ли ставить круглые скобки так:

a || (!b && !a) || b

, и результат будет false или же false или же true равный true?

0

Решение

Как уже упоминалось в комментариях, в первом случае выражение связано с приоритет оператора оценивается как

(std::cout << a) || !b && !a || b;

Результат std::cout << a это ссылка на std::cout сам объект, который в C ++ 03 конвертируется в bool через operator void*() унаследованный от std::basic_ios, В C ++ 11 есть operator bool() вместо этого, что позволяет так называемый контекстное преобразование.

Остальное поэтому просто логическое выражение и его результат отбрасывается.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]