2012-05-23 3 views
5

우선 순위가 & & 인 경우 ||보다 크면이 코드가 --b & & ++ c를 먼저 평가하지 않아야하므로 출력이 1 2 4 11이어야합니다. 1 2 5 10 줄을 단락 된 것 같습니다. 제발 도와주세요!평가 순서 || && in c

int x; 
int a=1,b=5,c=10; 
x=a++||--b&&++c; 
printf("%d %d %d %d\n",x,a,b,c); 
return 0; 

답변

14

이 코드는 & & C++ 첫번째

없음 연산자 우선 순위는 평가 순서에 영향을주지 않습니다 --b 평가해서는 안된다. 그냥 그래서 먼저 평가 a++는 여전히, 따라서 단락 문

a++||--b&&++c 

a++||(--b&&++c) 

에 equilvalent 것을 의미한다.

+0

그래서 어떻게 괄호를 넣어야하는지 알 수 있습니까? – Ashwyn

+2

@Ashwyn Thum의 좋은 규칙은 의도가 명확하지 않은 경우 괄호를 넣는 것입니다. 이 경우에는 괄호로 묶지 않아도됩니다. IMO는 어떻게되는지 분명합니다. –

+0

@Ashwyn 당신이 그 요점을 놓치고 있다고 생각합니다. 당신은 &&가 ||보다 단단하다고 가정하는 것이 옳습니다.그러나 표현은 여전히 ​​왼쪽에서 오른쪽으로 평가됩니다. –

2

우선 순위가 && 일 때 더 높습니다. 즉, 왼쪽 및 오른쪽에있는 항목을 ||보다 엄격하게 바인딩합니다. 그 표현이

a++ || (--b && ++c) 

||에 해당 그래서 왼쪽의 표현식이 아닌 0으로 평가되는 경우에만 오른쪽의 일을 평가한다. a가 1이므로 a++ 만 평가되고 b은 감소하지 않고 c은 증가하지 않습니다.

2

예, &&는 높은 우선 순위를 가지고 있지만, 단지 평가의 피연산자의 아닌 위해 그룹화를 결정합니다. 여기에 기본 연산은 ||입니다.이 연산은 오른쪽 연산이 무엇이든 관계없이 왼쪽이 참이면 오른쪽이 평가되지 않도록합니다.

1

여기에 직장에서 두 가지 개념이있다

  1. 운영자 연관성 C에서
  2. 컴파일러 최적화 단락

, || 연산자는 왼쪽 연관입니다. 결과적으로, ++가 먼저 평가 될 것입니다. 왼쪽이 TRUE이므로 컴파일러 최적화 단락하면 오른쪽의 || 표현식의 결과가 변경되지 않으므로 평가되지 않습니다.

+0

이것은 최적화 나 컴파일러와 아무 관련이 없습니다. 단락은 표준 정의 된 동작입니다. –

+0

컴파일러 최적화가 선택적이지만 단락 회로는 선택 사항이 아니라는 점에서 당신은 맞습니다. 그러나 직관적으로 이것은 최적화입니다. 나는 대답을 편집 할 것이다. 감사. –

+0

훨씬 더 선명하게! ... –