Как операторы , так и &&
вынуждают левую-правую оценку. Левый операнд будет полностью оценен (и все побочные эффекты) до того, как будет оценен правый операнд.
Кроме того, оба оператора короткое замыкание - в зависимости от значения левого операнда правомерный операнд вообще не может быть оценен.
Для
a || b
, если a
верно, то все выражение верно независимо от значения b
, поэтому b
не вычисляется.
Аналогично, для
a && b
если a
ложна, то все выражение является ложным, независимо от значения b
, поэтому b
не вычисляется.
&&
имеет более высокий приоритет, чем ||
, так что
a || b && c
будет разобрано как
a || (b && c)
и
a && b || c
будет разобрано как
(a && b) || c
Итак ...
a > 45 || b > 50 && c > 10
обрабатывается как
a > 45 || (b > 50 && c > 10)
С a == 50
, a > 45
верно. Поскольку a > 45
- левый операнд оператора ||
, все выражение истинно независимо от правого операнда, поэтому b > 50 && c > 10
не оценивается вообще.
Результат выражения равен 1 (true).
К сожалению, printf
ожидает, что его первый аргумент указывает на строку символов (строка формата), а 1
, скорее всего, не является допустимым адресом на вашей платформе, поэтому результат этого кода, скорее всего, будет segfault. Легкое исправить было бы написать
printf("%d\n", a > 45 || b > 50 && c > 10);
'a> 45 || b> 50 && c> 10' будет группироваться как '(a> 45) || (b> 50 && c> 10). Порядок оценки подвыражений будет идти слева направо. – haccks
Кроме того, проверьте: http://en.cppreference.com/w/c/language/operator_precedence –
Пожалуйста, не пишите такой код, вы получите пару дополнительных круглых скобок; –