2012-05-03 2 views
3

이 C 프로그램의 출력은 무엇이되어야합니까?다음 C 프로그램의 출력

#include<stdio.h> 
int main(){ 
    int x,y,z; 
    x=y=z=1; 
    z = ++x || ++y && ++z; 
    printf("x=%d y=%d z=%d\n",x,y,z); 
    return 0; 
} 

지정된 출력은 : X = 2, Y = 1, Z =
I은 ​​X에 대한 출력을 이해할 수 있지만, 증가되지 않는 방법 Y 및 Z 값을 참조하지 1.

답변

12

이것은 short-circuit evaluation의 결과입니다.

표현 ++x2로 평가하고, 컴파일러는 2 || anything 항상 상관없이 anything가 무엇인지 ("true"로) 1로 평가 없다는 것을 알고있다. 따라서 anything을 평가하지 않고 yz의 값은 변경되지 않습니다. 당신이

x=-1; 
y=z=1; 

으로하려고하면 컴파일러는 식의 결과를 결정하기 위해 OR의 오른쪽을 평가하기 때문에

당신은, yz이 증가 될 것을 볼 수 있습니다.

편집 : asaerl이 의견에 귀하의 후속 질문에 대한 답변을 먼저 입력 했으므로 정답을 약간 확장 해 보겠습니다.

연산자 우선 순위는 식을 구성하는 파트가 함께 바인딩되는 방식을 결정합니다. AND는 OR보다 높은 우선 순위를 가지고 있기 때문에, 컴파일러는 대신

(++x || ++y) && ++z 

이 그것을 ++x++y && ++z 사이에 OR을 수행하는 임무가 주어 잎의

++x || (++y && ++z) 

을 쓴 것을 알고있다. 이 시점에서 일반적으로 표준에 따라 하나 또는 다른 표현식을 먼저 평가하는 것이 "선호"되는 경우 자유롭게 선택할 수 있으며 일반적으로 특정 순서에 의존 할 수는 없습니다. 이 순서는 연산자 우선 순위와는 아무런 관련이 없습니다. ||&& 표준에 대한 구체적 그러나

는, 단락이 작동 할 수 있으며 개발자가 평가되지 우변의 발현에을 따라 할 수 있도록 평가 항상이 왼쪽에서 오른쪽으로 진행 것을 요구하는 경우 평가 결과 lhs는 말한다.

+1

도움을 주셔서 감사 합니다만, 우선 순위는 여기에 적용되지 않습니까? ++ y && ++ z가 먼저 평가되어야 함을 의미합니다. ? – krishnang

+4

번호 우선 순위는 평가 순서가 아닌 구문 분석 순서입니다. BTW,'++ z'가 평가 되었다면 그것은 UB였습니다. ('z'를 두 번 변경) – asaelr

1

C에서는 0 이외의 모든 것을 true로 처리하고 || 왼쪽에서 오른쪽으로 시작하자.

따라서 컴파일러는 첫 번째 왼쪽 피연산자를 검사하고 참이면 컴파일러는 다른 피연산자를 검사하지 않습니다. 예. A || B -이 경우 A가 true이면 컴파일러는 true를 반환하고 B가 true인지 False인지 확인하지 않습니다. 다만, A가 false의 경우는 B를 체크해, B가 true의 경우는 true를 돌려 주어, B가 false의 경우는 false를 돌려줍니다.

프로그램 컴파일러에서 먼저 ++ x (즉 2)를 확인하고 C 이외의 다른 0은 C에 true입니다. 따라서 다른 표현식을 검사/증가시키지 않습니다.

관련 문제