그렇습니다 (평가 순서 및 단락 모두). 예제에서 모든 함수가 true를 반환하면 호출 순서는 functionA, functionB, functionC의 순서입니다. 이런 식으로 사용
if(ptr && ptr->value) {
...
}
쉼표 연산자와 동일합니다.
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
하나는 왼쪽과 오른쪽의 피연산자 사이 말한다 &&
, ||
, ,
및 첫번째 및 두번째 / 번째 피연산자 사이 ?:
(조건 연산자)를 "시퀀스 점"이다. 해당 시점 이전에 모든 부작용이 완전히 평가됩니다. 따라서 이것은 안전합니다.
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
쉼표 연산자를 사물을 구분하는 데 사용되는 구문 쉼표와 혼동하지 마십시오.
// order of calls to a and b is unspecified!
function(a(), b());
C ++ 표준은 다음과 5.14/1
같이 말합니다 .
&& 연산자 그룹은 왼쪽에서 오른쪽입니다. 피연산자는 모두 암시 적으로 bool 유형으로 변환됩니다 (4 항). 두 피연산자가 모두 true이면 결과가 true이고, 그렇지 않으면 false입니다. &와 달리 &&는 왼쪽에서 오른쪽으로 평가합니다. 첫 번째 피연산자가 false 인 경우 두 번째 피연산자는 평가되지 않습니다.
그리고 5.15/1
:
|| 운영자 그룹은 왼쪽에서 오른쪽으로. 피연산자는 모두 암시 적으로 부울로 변환됩니다 (4 항). 피연산자 중 하나가 true이면 true를, 그렇지 않으면 false를 반환합니다. |, ||와 달리 좌우 평가를 보장합니다. 또한 첫 번째 피연산자가 true로 평가되면 두 번째 피연산자는 평가되지 않습니다.
그것은 그 옆에 모두를 위해 말합니다 :
결과는 바보입니다. 임시 표현 (12.2)의 파괴를 제외한 첫 번째 표현의 모든 부작용은 두 번째 표현이 평가되기 전에 발생합니다.
그 외에도 1.9/18
말한다
각 표현의 평가에서
a && b
a || b
a ? b : C
a , b
이 식 (5.14, 5.15, 5.16, 5.18)에서 연산자의 내장 의미를 사용하면 첫 번째 식을 평가 한 후 시퀀스 포인트가 있습니다.