Продиктовано ли «логическое короткое замыкание» стандартом или оно в основном используется в качестве оптимизации?[дубликат]

StackOverflow https://stackoverflow.com/questions/852676

Вопрос

Учти это

Class* p = NULL;
if( p != NULL && p->Method() == OK ){

  // stuff
}

На всех компиляторах, с которыми я работал, это вполне безопасно.Т.е.первая часть логического выражения будет иметь значение ЛОЖЬ, и вызов Method(), таким образом, не будет предпринят, поскольку оценка второй части является избыточной.

Это потому, что большинство компиляторов оптимизируют вычисление второй части, или это поведение, продиктованное стандартами C/C++?

Это было полезно?

Решение

Это называется логическим коротким замыканием и определено во многих языках. Здесь — это статья в Википедии, в которой описывается, какие языки имеют эту функцию.

Теперь, когда вы знаете правильное название функции, есть другие статьи о SO об этом тоже.

Другие советы

Короткое сокращение экспрессии гарантируется стандартом.

С++ Стандарт 1998 г.
Раздел 5.14

Оператор && группируется слева направо.Операнды оба неявно преобразуются в Type Bool (пункт 4).Результат верен, если оба операнда истины и ложны в противном случае.В отличие от &, && гарантирует оценок слева направо:Второй операнд не оценивается, если первый операнд является ложным.

Я еще не видел упоминания об этом, поэтому:

Короткое замыкание гарантируется C++. за исключением случаев, когда && или || вызываемый оператор перегружен.Но не делайте этого, потому что это слишком запутанно.

Это особенность, называемая коротким замыканием.Такое поведение гарантируется стандартом C++.Я не думаю, что это, так сказать, оптимизация, но это скорее просто языковая функция.

Это не просто оптимизация, это полезно, чтобы вы могли быть более краткими.

Как показывает ваш пример, он позволяет написать «безопасный» оператор разыменования в одну строку.В противном случае вам придется сделать что-то вроде:

if (p != null) {
    if (p.getValue() == 3) {
        // do stuff
    }
}

Кажется тривиальным, но попробуйте написать код на языке, на котором его нет (например.VB6) и начинаешь по нему очень скучать.

Как упоминается в других ответах, это есть в языковых стандартах, но только потому, что что-то подобное необходимо четко указать.То, что он может скомпилироваться в оптимизированный код, является побочным эффектом;в наши дни приличный компилятор C или C++ компилирует однострочные или двухстрочные операторы одинаково

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top