Составно, если проверка на нуль, а затем другие условия в C++ всегда безопасны?
(этот вопрос является точной копией Составного, если проверка на нулевое значение, а затем другие условия в C всегда безопасны? но о C++, а не C. Было отмечено, что вопрос должен быть более конкретным).
Я использовал следующий тип if
состояние на много времени.
char* ptr = ...;
if (ptr != NULL && ptr[0] != '\0') // <=== is this always safe?
{ /* ... */ }
Опирается на ptr != NULL
проверяться перед ptr[0] !='\0'
,
Это безопасно по всем стандартам, компиляторам, архитектурам? Или есть вероятность, что ptr[0] != '\0'
будет проверено раньше ptr != NULL
?
2 ответа
Это безопасно в этом случае. Оценка короткого замыкания означает, что RHS &&
Оператор будет оцениваться, только если первое верно.
C++ позволяет переопределить bool operator &&
для пользовательских типов. Использование переопределения &&
не следует оценке короткого замыкания, поэтому безопасность теряется. Редко хорошая идея перегружать этот оператор.
Вот пример, показывающий поведение перегруженного &&
оператор:
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
}
Это безопасно, пока оператор &&
не перегружен
Черновик стандарта C++ (N3337 - 5.14 Логический оператор AND):
Операторы && группируются слева направо. Оба операнда контекстуально преобразуются в тип bool (пункт 4). Результат равен true, если оба операнда имеют значение true, в противном случае - false. В отличие от &, && гарантирует оценку слева направо: второй операнд не оценивается, если первый операнд является ложным.