2012-05-17 2 views
1

두 개의 개별 코드 부분에서 증분/감소자가 왜 다르게 작동합니까?C 조 작 ​​순서

단편 A :

0 
7 8 9 

단편 B :

i=7; j=8; k=9; 
printf("%d\n", i - 7 && j++ > k); 
printf("%d %d %d", i, j, k); 

다음 출력 생성한다

T minus 5 and counting 
T minus 4 and counting 
T minus 3 and counting 
T minus 2 and counting 
T minus 1 and counting 
01 :

while (i > 0) 
printf("T minus %d and counting\n",i--); 

이 만들어

이제는 함수에 대한 인수가 값으로 전달된다는 사실을 알고 있으며 부울 식에서 j이 사용된다는 사실과 관련이 있어야합니다. 그러나이 두 상황은 나에게 모순되는 것처럼 보입니다. 무슨 일 이니? 좋아

+1

조각 B에서 'i'가 5로 가정됩니까? 이 경우 출력이 예상됩니다. –

+0

어떤 행동을 기대합니까? – robert

+0

@grimetime은 그가'i -'가 호출 될 때마다 i의 값을 감소시키는 이유를 이해하지 못한다고 생각하지만,'j ++'는 호출 된 후에 j의 값을 변경하지 않는다고 생각합니다. – Jamie

답변

7

, 당신은 연산자 우선 순위를 가지고 있기는 하고 작동 정확히 어떻게을 배열하는 방법을 자세히 매우를 볼 필요가 것입니다. 이것이 숙제이기 때문에 나는 정확한 답을주지 않을 것이지만,해야 할 두 가지가있다.

  1. &&정확한 행동을 봐 우선 순위 테이블을 사용하여 전체 괄호 발발했습니다 식을 다시 작성
  2. . 특히 하위 표현식 j++ > k은 언제 실행됩니까?
2

단락이라고합니다. 왼쪽 손이 & & 일 때 위변조로 평가되면 오른쪽이 더 이상 실행되지 않습니다 (건너 뜁니다).

+2

글쎄, 아니, 최적화되지 않았습니다 -이 코드는 옵티 마이저없이 동일하게 동작합니다. –

+0

아, 죄송합니다. 단어가 잘못 나왔다. 그것을 고치기 –

1

여기에서 짧은 회로가 작동합니다 (& &). 표현식의 왼쪽 만 평가됩니다.

0

단편 A :

가 ">"그래서, 이런

printf("%d\n", i - 7 && j++ > k); 

"& &"보다 우선 순위를 가지고

printf("%d\n", i - 7 && (j++ > k)); 

및 "& &"는 단락 회로이며 (i - 7) == 0이 FALSE이므로, (j ++> k)는 무시 될 것이고,이 세 숫자는 모두 chan이 아니다. ged.

조각 B :

"나 ..."다음 첫째 값의 원본을 반환 할 것이다 뺀.