2017-10-13 5 views
-2
#include <stdio.h> 

int main(){ 
    int a=5,b=-7,c=0,d; 
    d=++a && ++b || ++c; 
    printf("%d %d %d %d",a,b,c,d); 
} 

여기에서 c의 값은 1로 증가하지만 0을주는 이유는 무엇입니까 ??왜 사전 증가가 평가되지 않는가

+1

[(부울) 단락 회로 평가] (https://en.wikipedia.org/wiki/Short-circuit_evaluation)가 다시 나타납니다. – alk

+0

첫 번째 부분 인'&&'가 이미'true'이므로 실행하지 않는'||'연산자로 인해서 만 알 수 있습니다. 따라서'|| ++ c'는 중요하지 않습니다. –

+0

@ AnteJablanAdamović 왜 그런가? –

답변

2

|| 왼쪽 편이 true로 평가되면 오른쪽 편을 평가하지 않습니다. 귀하의 예에서,

++a && ++b 

은 0으로 평가되며, 사실로 취급됩니다. 따라서 지연 평가 규칙에 따라 ++c은 완전히 무시됩니다.

4

단락의 원인입니다. a && b이있는 경우 이 true 인 경우에만 b이 계산됩니다. 마찬가지로 a || b 인 경우 ba이 거짓 인 경우에만 평가됩니다.

++a && ++b || ++c 그룹의 경우 (++a && ++b) || ++c입니다. 먼저 ++a이 평가되고 사실이므로 ++b이 평가되며 그 또한 마찬가지입니다. 이 시점에서 || 연산자의 결과가 참임을 확신하므로 평가가 중지되므로 ++c은 평가되지 않습니다.