2014-02-14 6 views
1

(этот вопрос является точной копией Is compound if checking for null and then other condition in C always safe?, но около C++, а не C. Было указано, что вопрос должен быть более конкретным).Является составным, если проверять значение null, а затем другое условие в C++ всегда безопасно?

Я использую следующий тип if состояние в течение длительного времени.

char* ptr = ...; 
if (ptr != NULL && ptr[0] != '\0') // <=== is this always safe? 
{ /* ... */ } 

Он полагается на ptr != NULL быть проверены перед ptr[0] !='\0'.

Безопасен ли он по всем стандартам, составителям, архитектуре? Или есть вероятность, что ptr[0] != '\0' будет проверен до ptr != NULL?

+0

Спасибо за повторную отправку. Это была правильная вещь (отдельные языки), но этот вопрос уже неоднократно задавался в прошлом. :) –

+1

@LightnessRacesinOrbit да, я видел близкие предложения, и это правда, это тот же вопрос. Все нормально, если оно закрывается. Я не удалю его, но это еще один способ перефразировать одну и ту же проблему, поэтому она привлечет больше хитов google. – Dariusz

+0

Да нет проблем. –

ответ

4

В этом случае это безопасно. Short-circuit evaluation означает, что RHS оператора && будет оцениваться только в том случае, если первое значение истинно.

C++ позволяет переопределить bool operator && для пользовательских типов. Использование overriden && не соответствует оценке короткого замыкания, поэтому безопасность теряется. Очень редко перегружать этого оператора.

Вот пример, показывающий поведение перегруженной && оператора:

struct Foo {}; 

bool operator && (const Foo&, const Foo&) { return true; } 

#include <iostream> 

Foo make_foo() 
{ 
    std::cout << "making foo\n"; 
    return Foo(); 
} 

int main() 
{ 
    make_foo() && make_foo(); // evaluates both expressions 
} 
+2

's/встроенные типы/пользовательские типы /'? – fredoverflow

+0

@FredOverflow Спасибо. Я не могу поверить, что у меня есть три голоса с этой вопиющей ошибкой! – juanchopanza

0

Это безопасно, пока оператор && не перегружен

C++ проект стандарта говорит (N3337 - 5,14 Логический оператор И) :

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

+0

Я еще не нашел соответствующую информацию о перегрузочной форме стандарта. Я добавлю его, когда найду его. – user694733