2013-03-26 6 views
4

Если у меня есть условие, как это:Семантика проверки, если условия

if (X && Y) {} 

Будет ли проверка компилятор Y если X является ложным? Является ли он зависимым от компилятора?

+0

Если он действительно пуст, компилятор, вероятно, оптимизирует его, и ни один из них не будет проверен. :) – Mike

+0

Возможно дублируется: http://stackoverflow.com/questions/628526/is-short-circuiting-boolean-operators-mandated-in-cc-and-evaluation-order –

+0

проверка выполняется во время выполнения, а не на этапе компиляции – MOHAMED

ответ

10

В C и most other languages оценка короткого замыкания гарантирована. Таким образом, Y оценивается только в том случае, если значение X равно true.

То же самое относится к X || Y - в этом случае Y оценивается только в том случае, если X оценивает значение false.

См. Mike's answer для ссылки на спецификацию С, где упомянуто и гарантировано такое поведение.

+0

не разрешен для оценки 'Y' сначала, то, может быть,' X'? –

+2

Нет, совсем нет. Это было бы ужасно: 'if (x && x-> foo)' - что, если 'x' был NULL? – ThiefMaster

+0

В этом случае вам нужно будет проверить 'x', а затем' x-> foo', в двух отдельных операторах 'if', которые я отчетливо помню, выполнив это. –

3

Y проверяется только если X является true

Если X ложно, то Y не будет проверяться

BTW Проверка выполняется во время выполнения исполнения, а не на этапе компиляции

1

И &&, и || сила слева направо. Оба будут вводить точку последовательности между первым и вторым операндами, если второй операнд будет оценен. Также не будет оцениваться второй операнд, если результат выражения может быть определен только из первого операнда. 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 года, онлайн-проект), поэтому он не зависит от компилятора.

7

Спецификации C (6.5.13) разъясняет этот момент для Вас:

4 В отличие от побитового двоичного & оператора, в & & оператор гарантии слева направо оценки; , если второй операнд оценивается, имеется точка последовательности между оценками первого и второго операндов. Если первый операнд сравнивается с 0, второй операнд не оценивается.

Так сам язык C defineds, что если X == 0 то Y не будет проверяться.

0

Если Y имеет побочные эффекты, или если доступ к ней может быть определено поведение (например, плохой указатель разыменования), то компилятор должен гарантировать, что Y не оценивается, если X не оценивается истина. Однако, если оба X и Y не имеют побочных эффектов, и компилятор знает, что доступ к ним хорошо определен, он может выбрать оптимизацию таким образом, чтобы выполнялись оба обращения.

+0

Почему -1? .... –

Смежные вопросы