2014-02-14 4 views
1

(이 질문은 Is compound if checking for null and then other condition in C always safe?의 정확한 사본이지만 약 C++이 아니고 C가 아닙니다. 더 구체적으로 질문해야 함).null을 확인한 후 C++의 다른 조건이 항상 안전하면 복합 항목입니까?

많은 시간 동안 다음 유형의 if 상태를 사용하고 있습니다. ptr != NULL에 그것은 의존

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

ptr[0] !='\0' 전에 확인된다.

모든 표준, 컴파일러, 아키텍처에서 안전합니까? 또는 ptr != NULL 전에 ptr[0] != '\0'이 확인 될 가능성이 있습니까?

+0

다시 게시 해 주셔서 감사합니다. 그것이 올바른 일이었습니다 (별도의 언어). 그러나이 질문은 이미 과거 여러 번 요청되었습니다. :) –

+1

@LightnessRacesinOrbit 예, 가까운 제안을 보았습니다. 사실입니다. 그것은 같은 질문입니다. 닫히면 괜찮습니다. 나는 그것을 삭제하지 않을 것이다, 그것은 동일한 문제를 바꾸는 또 다른 방법이다. 그래서 그것은 더 많은 구글 안타를 끌 것이다. – Dariusz

+0

네, 문제 없습니다. –

답변

4

이 경우 안전합니다. Short-circuit evaluation&& 연산자의 RHS가 첫 번째가 참인 경우에만 평가된다는 것을 의미합니다.

C++에서는 사용자 정의 형식에 대해 bool operator &&을 재정의 할 수 있습니다. 재정의 된 &&을 사용하면 단락 회로 평가가 수행되지 않으므로 안전이 손실됩니다. 이 연산자에 과부하를주는 것이 거의 불가능합니다.

가 여기에 오버로드 && 연산자의 동작을 보여주는 예입니다 : 운영자 &&

C 과부하되지 않는

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

그것은만큼 안전을 ++ 표준 초안은 말한다 (N3337 - 5.14 논리 AND 연산자) :

& 연산자 그룹은 왼쪽에서 오른쪽입니다. 피연산자는 모두 문맥 상 bool 유형으로 변환됩니다 (4 절). 두 피연산자가 모두 true이면 결과가 true이고 그렇지 않으면 false입니다. &과 달리 & &은 왼쪽에서 오른쪽으로 평가를 보장합니다. 첫 번째 피연산자가 false이면 두 번째 피연산자는 평가되지 않습니다.

+0

오버로드 양식에 대한 관련 부분을 아직 찾지 못했습니다. 나는 그것을 발견 할 때 그것을 추가 할 것이다. – user694733

관련 문제