C if оператор с && - Какая функция будет выполняться первой? - PullRequest
11 голосов
/ 28 ноября 2011

Если у меня есть оператор if в C, который выглядит следующим образом:

if( function1() > 0 && function2() > 0 ){

    //blah

}

Какая функция будет выполняться первой и всегда ли она будет выполняться в этом порядке?

Ответы [ 7 ]

27 голосов
/ 28 ноября 2011

Здесь function1() - это гарантированный для выполнения первым.

Оператор && является оператором короткого замыкания . function2() даже не будет вызван, если результат function1() больше нуля.

Из стандарта C99:

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

3 голосов
/ 28 ноября 2011

function1() будет выполнено первым, и если его результат меньше или равен 0 function2(), не будет выполнен вообще.

3 голосов
/ 28 ноября 2011

function1 и да. function2 будет вызываться тогда и только тогда, когда предыдущим условием будет true.

Это называется «короткое замыкание», и оно необходимо, например, для такого утверждения: if (p != 0 && *p == 'X') Мы можем быть уверены, что p никогда не разыменовывается, если оно равно нулю.

1 голос
/ 28 ноября 2011

Это будет оцениваться слева направо. Проверьте это для больше информации

1 голос
/ 28 ноября 2011

В этом конкретном случае, функция1 всегда будет выполняться первой, потому что вы используете оператор &&.

Кроме того, если function1 ()> 0, функция2 вообще не будет вызываться.

0 голосов
/ 28 ноября 2011

В вашем коде фрагмент function1() будет выполняться первым, а function2() будет выполняться только , если первое условие даст true.

Вы можете легко проверить это: добавить несколькоprintf в каждой функции и пусть function1() возвращает 1.

0 голосов
/ 28 ноября 2011

function1() будет вызван первым.Это не if, который подразумевает порядок, но &&: левый операнд вычисляется первым, а второй операнд вычисляется вообще, только если левый операнд возвратил ненулевое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...