2016-08-30 3 views
3

누군가이 짧은 줄의 코드가 1을 반환하는 이유를 설명 할 수 있습니까?double postincrementation 결과 - if 문과 본문

int i = 0; 
if(i++) i++; 
printf("%d", i); 

나는 문 i 달리 증가해야하는 경우를 검사 할 때 결과가 1 일이 아닌 것이다 의미 다음은 더 나은 2.

그리고 그 결과를 다시 한 번 증가해야한다 증가로 , 왜이 코드 라인이 결과 2입니까? 또한

int i = 0; 
if(++i || i++) i++; 

int i = 0; 
if(++i && i++) i++; 

반환

+0

C11 표준 초안이 될 것입니다 n1570 : * 6.5.2.4 접미사 증가 및 감소 연산자 2 postfix ++ 연산자의 결과는 피연산자의 값입니다. [...] 결과 값 계산은 의 부작용 * – EOF

+6

'i ++'의 _result_은 0이므로'if()'는 취하지 않습니다. – chux

+2

접미사 형식은 표현식이 계산 된 후에 변수에 저장된 값을 증가 시키므로 if()에 0을 테스트 표현식으로 사용합니다. – Serge

답변

2
  • if(i++) 검사 i 값 증분 전의 코드의 라인 (3). 그래서 검사가 i=0 때문에 실패하고 확인 후, i 1.
  • 에 동일 만드는 if 조건을 떠나기 전에 증가합니다 그러나 조건이 1로 평가하는 검사 전에 ++i 평가하고 조건이되기 때문에 if(++i || i++) 통과 사실이면 i++이되고 결과는 2가됩니다.
  • 또한 ++ i는 1이 ​​될 것이고 i ++도 증가하기 전에 먼저 사용되기 때문에 여전히 1입니다. 그래서 1 & & 한 사실이 다음 조건을 떠나기 전에, 내가 2로 증가 될 것이며, 또한 경우에 아래 라인이 3 평가되고 난의 새 값이 3
+0

하지만 다시'if (++ i && i ++) i ++; 결과가 3입니다. – Lisek

+0

'++ i'가 1이 될 것이므로 맞습니다. 'i ++'는 증가하기 전에 먼저 사용되기 때문에'i ++'도 여전히 1입니다. 따라서 1 && 1이 참이고 조건을 떠나기 전에'i'가 2로 증가하고'if' 아래의 줄은 3으로 평가되고'i'의 새 값은 3이됩니다. . – d3r1ck

+0

@Lisel 두식이 모두 평가 되었기 때문에 첫 번째식이 '참'이므로 두 번째 식은'&& '로 인해 evalauted되어야합니다. 두식이 모두 참이어야합니다. –