문제

이걸 고려하세요

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

  // stuff
}

내가 함께 일한 모든 컴파일러에서 이것은 매우 안전합니다. 즉 부울 표현의 첫 번째 부분은 거짓, 두 번째 부분을 평가하는 것이 중복되기 때문에 메소드 ()에 대한 호출은 시도되지 않습니다.

대부분의 컴파일러가 두 번째 부분의 평가를 최적화 할 것이기 때문에 C/C ++ 표준에서 지시 된 동작입니까?

도움이 되었습니까?

해결책

이것을 부울 단락이라고하며 많은 언어로 정의됩니다. 여기 이 기능이있는 언어를 설명하는 Wikipedia 기사입니다.

이제 기능의 올바른 이름을 알았으므로 다른 기사 그것에 대해서도.

다른 팁

표현 단락은 표준에 의해 보장됩니다.

с ++ 표준 1998
섹션 5.14

&& 운영자 그룹은 왼쪽에서 오른쪽으로. 피연산자는 모두 암시 적으로 유형 BOOL (4 항)으로 변환됩니다. 두 피연산자가 모두 참이고 그렇지 않으면 결과는 사실입니다. &, &&와 달리 왼쪽에서 오른쪽으로 평가합니다. 첫 번째 피연산자가 False 인 경우 두 번째 피연산자는 평가되지 않습니다.

아직 언급 한 보지 못했습니다.

단락은 C ++에 의해 보장됩니다 때를 제외하고 && 또는 || 호출되는 운영자가 과부하가 걸립니다. 그러나 너무 혼란 스럽기 때문에 그렇게하지 마십시오.

이것은 단락이라는 기능입니다. 이 동작은 C ++ 표준에 의해 보장됩니다. 나는 그것이 말하기에 최적화라고 생각하지 않지만 그것은 단순히 언어 기능에 훨씬 더 유용합니다.

그것은 단지 최적화가 아니라 더 간결하게 할 수있게하는 것이 유용합니다.

예제에서 알 수 있듯이 한 줄에 "안전한"DeCeperencing 문을 쓸 수 있습니다. 그렇지 않으면 다음과 같은 작업을 수행해야합니다.

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

사소한 것처럼 보이지만 언어가없는 언어로 코딩을 시도해보십시오 (예 : VB6).

다른 답변이 언급 한 것처럼 언어 표준이지만 이와 같은 것이 명확하게 지정되어야하기 때문입니다. 최적화 된 코드로 컴파일 할 수 있다는 것은 부작용입니다. 요즘 괜찮은 C 또는 C ++ 컴파일러가 한 줄 또는 2 라인 문을 수적으로 컴파일합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top