이것은 short-circuit evaluation의 결과입니다.
표현 ++x
는 2
로 평가하고, 컴파일러는 2 || anything
항상 상관없이 anything
가 무엇인지 ("true"로) 1
로 평가 없다는 것을 알고있다. 따라서 anything
을 평가하지 않고 y
및 z
의 값은 변경되지 않습니다. 당신이
x=-1;
y=z=1;
으로하려고하면 컴파일러는 식의 결과를 결정하기 위해 OR의 오른쪽을 평가하기 때문에
당신은, y
및 z
이 증가 될 것을 볼 수 있습니다.
편집 : asaerl이 의견에 귀하의 후속 질문에 대한 답변을 먼저 입력 했으므로 정답을 약간 확장 해 보겠습니다.
연산자 우선 순위는 식을 구성하는 파트가 함께 바인딩되는 방식을 결정합니다. AND는 OR보다 높은 우선 순위를 가지고 있기 때문에, 컴파일러는 대신
(++x || ++y) && ++z
이 그것을 ++x
및 ++y && ++z
사이에 OR을 수행하는 임무가 주어 잎의
++x || (++y && ++z)
을 쓴 것을 알고있다. 이 시점에서 일반적으로 표준에 따라 하나 또는 다른 표현식을 먼저 평가하는 것이 "선호"되는 경우 자유롭게 선택할 수 있으며 일반적으로 특정 순서에 의존 할 수는 없습니다. 이 순서는 연산자 우선 순위와는 아무런 관련이 없습니다. ||
및 &&
표준에 대한 구체적 그러나
는, 단락이 작동 할 수 있으며 개발자가 평가되지 우변의 발현에을 따라 할 수 있도록 평가 항상이 왼쪽에서 오른쪽으로 진행 것을 요구하는 경우 평가 결과 lhs는 말한다.
출처
2012-05-03 13:48:51
Jon
도움을 주셔서 감사 합니다만, 우선 순위는 여기에 적용되지 않습니까? ++ y && ++ z가 먼저 평가되어야 함을 의미합니다. ? – krishnang
번호 우선 순위는 평가 순서가 아닌 구문 분석 순서입니다. BTW,'++ z'가 평가 되었다면 그것은 UB였습니다. ('z'를 두 번 변경) – asaelr