2016-01-14 2 views
2

Почему я получаю отличный результат на третьей строке? Выход:Получение другого результата при печати выражения, написанного в обратном порядке

1 
1 
0 
1 

Я не должен получить на линии нет. 3 также выход 1 вместо 0? Он имеет тот же синтаксис, что и другие строки.

#include <iostream> 
using namespace std; 

int main() 
{ 
    int x = -3; 
    bool a = (x % 2 == 1) || (x < 0); 
    bool b = (x < 0) || (x % 2 == 1); 
    cout << a << "\n";        // line 1 
    cout << b << "\n";        // line 2 
    cout << (x % 2 == 1) || (x < 0); cout << "\n"; // line 3 
    cout << (x < 0) || (x % 2 == 1); cout << "\n"; // line 4 
}  

ответ

10

Из-за operator precedence, который operator<< имеет более высокую, чем operator||, только

(x % 2 == 1) 

часть печатается. Остальное - это делать cout || (x < 0);. (Обратите внимание, что std::cout, как и любой другой std::basic_ios полученный поток неявно конвертируется в bool)

С скобками, это выглядит следующим образом:

(cout << (x % 2 == 1)) || (x < 0); 

линия 4 печатных 1, потому что (x < 0) правда, и вы перешли операнды - теперь это должно быть ясно.

Решение:operator|| заключать в скобках вызова:

cout << (x % 2 == 1 || x < 0); 

Скобки вокруг операндов operator|| «s являются, с другой стороны, избыточными.