2014-04-07 1 views
-3

이유는 두 번째 행C 프로그램 논리 연산자 시퀀스

int i=-3, j=2, k=0, m; 
m = ++i && ++j || ++k; 

++j 후 종료하고 ++k 무시 것인가? 첫 번째 절반은 TRUE 값을 만들고 다음 값이 무엇이든간에 TRUE를 반환합니다. 그러나 다음과 같은 도구의 실행을 중단하는 조건은 무엇입니까? 우리가 최종 가치를 확인할 수있는 한?

+1

가능한 중복 [C : C++에서와 같이 할 때 사용하는 "지연 평가"가되어 && 연산자 (http://stackoverflow.com/questions/3958864/c -is-there-lazy-evaluation-when-using-operator-as-in-c) – lorenzog

+1

중복 된 http://stackoverflow.com/questions/3958864/c-is-there-lazy-evaluation-when-using- 연산자와 같이 연산자; 또한 설명을 보려면 http://c-faq.com/expr/shortcircuit.html을 참조하십시오. – lorenzog

+0

스스로에게 물어보십시오. 왜 평가를 받아야합니까? 조건이 충족 되었기 때문에 어쩌면? – nietonfir

답변

1

&&||보다 우선합니다. 서브 표현식 ++i++j 모두 비 제로이므로 ++i++j와 그것에 결합하고

m = ++i && ++j || ++k; 

은이 true로 해석

m = (++i && ++j) || ++k; 

로서 해석된다. 논리 연산자의 단락 회로 동작으로 인해 두 번째 (오른쪽) 하위 식은 ||의 경우 왼쪽에서 계산하면 true이됩니다.
||의 왼쪽 하위 식은 이 아니라 (++i && ++j)입니다.

1

조건은 정확히 같습니다. C의 OR에서 결과가 참일 때마다 나머지 표현식도 평가되지 않습니다.

당신은 참 또는 거짓 테스트도 증가 관련된 변수, 대신 전에 다음 테스트 변수를 증가시켜야 있는지 확인하려면 다음

++i; 
++j; 
++k; 

m = i && j || k; 
1

|| 연산자는 두 번째 피연산자를 평가하지 않습니다 첫 번째 피연산자가 TRUE를 평가하면. && 연산자는 첫 번째 피연산자가 FALSE를 평가하면 두 번째 피연산자를 계산하지 않습니다.

0

논리 AND 및 논리 OR 표현식의 피연산자는 왼쪽에서 오른쪽으로 계산됩니다. 첫 번째 피연산자의 값이 연산 결과를 결정하기에 충분하면 두 번째 피연산자는 계산되지 않습니다. 이를 "단락 회로 평가 (short-circuit evaluation)"라고합니다. 첫 번째 피연산자 다음에 시퀀스 포인트가 있습니다. 자세한 내용은 시퀀스 포인트를 참조하십시오.

대답 당신이 원하는하기 : here