Если у меня есть условие, как это:Семантика проверки, если условия
if (X && Y) {}
Будет ли проверка компилятор Y
если X
является ложным? Является ли он зависимым от компилятора?
Если у меня есть условие, как это:Семантика проверки, если условия
if (X && Y) {}
Будет ли проверка компилятор Y
если X
является ложным? Является ли он зависимым от компилятора?
В C и most other languages оценка короткого замыкания гарантирована. Таким образом, Y
оценивается только в том случае, если значение X
равно true.
То же самое относится к X || Y
- в этом случае Y
оценивается только в том случае, если X
оценивает значение false.
См. Mike's answer для ссылки на спецификацию С, где упомянуто и гарантировано такое поведение.
не разрешен для оценки 'Y' сначала, то, может быть,' X'? –
Нет, совсем нет. Это было бы ужасно: 'if (x && x-> foo)' - что, если 'x' был NULL? – ThiefMaster
В этом случае вам нужно будет проверить 'x', а затем' x-> foo', в двух отдельных операторах 'if', которые я отчетливо помню, выполнив это. –
Y
проверяется только если X
является true
Если X
ложно, то Y
не будет проверяться
BTW Проверка выполняется во время выполнения исполнения, а не на этапе компиляции
И &&
, и ||
сила слева направо. Оба будут вводить точку последовательности между первым и вторым операндами, если второй операнд будет оценен. Также не будет оцениваться второй операнд, если результат выражения может быть определен только из первого операнда. IOW, для X && Y
, Y
не будет оцениваться, если X
является ложным, тогда как для X || Y
, Y
не будет оцениваться, если верно X
.
Обратите внимание, что приоритет не влияет на порядок оценки; с учетом такого выражения, как X || Y && Z
, Y && Z
будет не оцениваться до X
, хотя &&
имеет более высокий приоритет, чем ||
. X
оценивается первым; если результат равен 0 (false), то оценивается Y
. Если этот результат отличен от нуля (true), то оценивается Z
.
Это определено в разделах 6.5.13 и 6.5.14 из language standard (версия 2011 года, онлайн-проект), поэтому он не зависит от компилятора.
Спецификации C (6.5.13) разъясняет этот момент для Вас:
4 В отличие от побитового двоичного & оператора, в & & оператор гарантии слева направо оценки; , если второй операнд оценивается, имеется точка последовательности между оценками первого и второго операндов. Если первый операнд сравнивается с 0, второй операнд не оценивается.
Так сам язык C defineds, что если X == 0
то Y
не будет проверяться.
Если Y
имеет побочные эффекты, или если доступ к ней может быть определено поведение (например, плохой указатель разыменования), то компилятор должен гарантировать, что Y
не оценивается, если X
не оценивается истина. Однако, если оба X
и Y
не имеют побочных эффектов, и компилятор знает, что доступ к ним хорошо определен, он может выбрать оптимизацию таким образом, чтобы выполнялись оба обращения.
Почему -1? .... –
Если он действительно пуст, компилятор, вероятно, оптимизирует его, и ни один из них не будет проверен. :) – Mike
Возможно дублируется: http://stackoverflow.com/questions/628526/is-short-circuiting-boolean-operators-mandated-in-cc-and-evaluation-order –
проверка выполняется во время выполнения, а не на этапе компиляции – MOHAMED