c ++, вычисление выражений с несколькими `&&` s и без оператора более низкого приоритета - PullRequest
2 голосов
/ 25 августа 2011

Если выражение оценивает несколько операторов && и не оценивает никакие операторы с более низким приоритетом (например, ||, ?:), будет ли выражение иметь значение 0, как только один из && sвернет 0 или завершит оценку оставшихся && s?

Например,

q=0; w=1; e=1; r=1;
if(q && w && r && e) {}

Будет ли это if() оценено как ложное, как только q && w станет равным 0(поскольку остальные && должны все равняться 0 независимо от операторов правой руки)?

Ответы [ 3 ]

5 голосов
/ 25 августа 2011

Да, оценка прекращается рано («короткое замыкание»), как только встречается ложное выражение.Есть одно исключение: если оператор && был перегружен для соответствующих типов аргументов.Это настоятельно не рекомендуется и крайне редко, но может случиться.

4 голосов
/ 25 августа 2011

Да, он выполняет оценку короткого замыкания для встроенных типов.У пользовательских типов, в которых вы перегружены && или ||, не будет выполнено короткое замыкание, что может вызвать незначительные ошибки.

2 голосов
/ 25 августа 2011

Другие уже указали ответ (т.е. "да").

Я отвечу, чтобы добавить пример одного идиоматического использования этого:

if ((p != NULL) && (*p == 42))
{
    /* Do something */
}

Если бы не было короткого замыкания, это должно было бы быть написано гораздо более неуклюже.

Обратите внимание, что вы также можете использовать это в Perl-esque манере, например ::

someCondition && doSomething();

, поэтому doSomething() вызывается, только если someCondition равно true. Но это компилируется, только если doSomething() возвращает тип, который может быть преобразован в bool, и это не считается идиоматическим C ++. (Обратите внимание, что этот метод не компилируется в C.)

...