"부울 단락"이 표준에 의해 지시되거나 대부분 최적화로 사용됩니까? [복제하다
-
21-08-2019 - |
문제
이걸 고려하세요
Class* p = NULL;
if( p != NULL && p->Method() == OK ){
// stuff
}
내가 함께 일한 모든 컴파일러에서 이것은 매우 안전합니다. 즉 부울 표현의 첫 번째 부분은 거짓, 두 번째 부분을 평가하는 것이 중복되기 때문에 메소드 ()에 대한 호출은 시도되지 않습니다.
대부분의 컴파일러가 두 번째 부분의 평가를 최적화 할 것이기 때문에 C/C ++ 표준에서 지시 된 동작입니까?
다른 팁
표현 단락은 표준에 의해 보장됩니다.
с ++ 표준 1998
섹션 5.14
&& 운영자 그룹은 왼쪽에서 오른쪽으로. 피연산자는 모두 암시 적으로 유형 BOOL (4 항)으로 변환됩니다. 두 피연산자가 모두 참이고 그렇지 않으면 결과는 사실입니다. &, &&와 달리 왼쪽에서 오른쪽으로 평가합니다. 첫 번째 피연산자가 False 인 경우 두 번째 피연산자는 평가되지 않습니다.
아직 언급 한 보지 못했습니다.
단락은 C ++에 의해 보장됩니다 때를 제외하고 &&
또는 ||
호출되는 운영자가 과부하가 걸립니다. 그러나 너무 혼란 스럽기 때문에 그렇게하지 마십시오.
이것은 단락이라는 기능입니다. 이 동작은 C ++ 표준에 의해 보장됩니다. 나는 그것이 말하기에 최적화라고 생각하지 않지만 그것은 단순히 언어 기능에 훨씬 더 유용합니다.
그것은 단지 최적화가 아니라 더 간결하게 할 수있게하는 것이 유용합니다.
예제에서 알 수 있듯이 한 줄에 "안전한"DeCeperencing 문을 쓸 수 있습니다. 그렇지 않으면 다음과 같은 작업을 수행해야합니다.
if (p != null) {
if (p.getValue() == 3) {
// do stuff
}
}
사소한 것처럼 보이지만 언어가없는 언어로 코딩을 시도해보십시오 (예 : VB6).
다른 답변이 언급 한 것처럼 언어 표준이지만 이와 같은 것이 명확하게 지정되어야하기 때문입니다. 최적화 된 코드로 컴파일 할 수 있다는 것은 부작용입니다. 요즘 괜찮은 C 또는 C ++ 컴파일러가 한 줄 또는 2 라인 문을 수적으로 컴파일합니다.