Короткое замыкание операторов &&
и ||
: если операнд слева определяет результат общего выражения, операнд справа не будет оцениваться.
Следовательно, математик будет описывать их как лево-ассоциативные, например.
a && b && c
⇔ (a && b) && c
, потому что математику это означает, что a
и b
считаются первыми. Однако для педагогических целей было бы полезно написать a && (b && c)
, чтобы подчеркнуть, что ниb
, ни c
не будут оцениваться, если a
является ложным.
Скобки в C только изменить порядок оценки, когда они переопределяют приоритет. Оба a && (b && c)
и (a && b) && c
будут оцениваться как a
сначала, а затем b
, затем c
. Аналогичным образом порядок оценки как
a + (b + c)
и (a + b) + c
не указан. Контраст a + (b * c)
по сравнению с (a + b) * c
, где компилятор по-прежнему может оценивать a
, b
и c
в любом порядке, но круглые скобки определяют, происходит ли сначала умножение или добавление. Кроме того, контраст FORTRAN, в котором, по крайней мере, в некоторых случаях заключенные в скобки выражения должны оцениваться в первую очередь.
Да, это важно. Короткое замыкание предотвратит оценку некоторых ваших операндов. – meagar
@meagar Как бы '(a && b) && c' отличаться от' a && (b && c) 'относительно короткого замыкания? Например, как бы '(false && b) && c' отличаться от' false && (b && c) '? Оба выражения не оценивают ни 'b', ни' c' ... – fredoverflow
@FredOverflow, если 'a' является ложным, вы правы. если 'b' является ложным,' c' никогда не оценивается. В принципе, если есть некоторая «ложная» слева от некоторых условий AND'd, тесты останавливаются на ней. –