3

이 매우 안전하다, 내가 함께 작업 한 모든 컴파일러에이"부울 단락"은 표준에 따라 결정되거나 주로 최적화로 사용됩니까?

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

    // stuff 
} 

을 고려하십시오. 나는. 부울 식의 첫 번째 부분은 거짓으로 계산되므로 두 번째 부분을 평가하는 것이 불필요하므로 Method() 호출을 시도하지 않습니다.

대부분의 컴파일러가 두 번째 파트의 최적화를 최적화하거나 C/C++ 표준의 지시대로 동작하기 때문에이 방법이 가능합니까?

+0

여기서 간단한 설명을 추가하기 만하면 컴파일러는 표준에 의해 허용되지 않는 경우 아무렇지도 않게 최적화하지 않을 것입니다. 컴파일러의 임무는 표준을 따르는 것처럼 행동하는 코드를 생성하는 것입니다. 따라서 컴파일러는 프로그램의 동작에 영향을 줄 수있는 코드를 최적화해서는 안됩니다. – jalf

+2

글쎄, 난 사람이 자신의 질문을 전에 dup로 닫는 투표를 본 적이. 나는 당신이 그 배지를받을 가치가 있다고 생각합니다! –

+0

@Paul : 건배. 그러나 처음부터 무엇을 검색해야할지 몰랐기 때문에 이것은 특별한 경우이기도합니다. – sharkin

답변

4

이것은 불리언 단락이라고 불리며 많은 언어로 정의됩니다. Here은이 기능이있는 언어를 설명하는 위키 백과 문서입니다.

이제 기능의 올바른 이름을 알았으므로이 기능에 대해서도 other SO articles이 있습니다.

4

표현식 짧은 절단은 표준에 의해 보장됩니다.

2

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

4

С ++ 표준 1998
5.14 절

& & 운영자 그룹은 왼쪽에서 오른쪽으로. 피연산자는 암시 적으로 을 bool 유형 (4 절)으로 변환합니다. 결과는 두 피연산자가 모두 이면 true이고 그렇지 않으면 false입니다. &과 달리 & & 은 왼쪽에서 오른쪽으로의 평가를 보장합니다. 첫 번째 피연산자가 false 인 경우 두 번째 피연산자는 계산되지 않습니다.

+0

어느 표준입니까? 우리는 C와 C++ 표준을 가지고 있습니다. 다른 많은 언어는 말할 것도없고, C 표준의 두 가지 버전 (이 기본 언어가 변경 될 가능성이있는 것은 아닙니다)을 보장합니다. –

2

나는 그렇게, 아직 언급 보지 못했다 :

짧은 단락은 && 또는 || 연산자는를 과부하 호출되는 경우를 제외하고 C++ 에 의해 보장된다. 그러나 너무 혼란 스럽기 때문에 그렇게하지 마십시오.

2

단순한 최적화가 아니라 더 간결하게 만드는 것이 유용합니다.

예제에서 볼 수 있듯이 한 줄에 "안전한"역 참조 문을 작성할 수 있습니다. 그렇지 않으면, 당신은 같은 것을 할 필요가 :

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

사소한 것 같다,하지만 그것은 (예를 들어, VB6)가없는 언어로 코딩을 시도하고 당신이 심하게 그것을 놓치지하기 시작합니다.

이 답변은 다른 답변과 마찬가지로 언어 표준에 명시되어 있습니다. 단, 이와 같은 것이 명확하게 지정되어야하기 때문입니다.최적화 된 코드로 컴파일 될 수 있다는 것은 부작용입니다. 요즘 괜찮은 C 또는 C++ 컴파일러는 한 줄 또는 두 줄의 문장을 합리적으로 컴파일 할 것입니다.