2013-05-12 4 views
0

오늘 나는 마술을 만났습니다.아직 다른 i = i ++

http://codepad.org/VW2vTpWw

언어 : C

코드 :

#include <stdio.h> 

main() 
{ 
    int i = 5; 
    i = i++; 
    printf ("%i", i); 
} 

출력 :

6 

어떻게? 왜?

이것은 까다로운 코드로되어 있지만 그 반대의 경우입니다. 부주의 한 프로그래머라면 i = i++은 단순한 증분 일 뿐이라고 생각할 것입니다. 그러나 그것은 마치 여기처럼 작동합니다. 5으로되어 있습니다! JavaScript에서와 같이.

어떻게해야합니까?

  • i5의 값을 얻습니다.
  • i++5을 반환합니다.
  • ii++ (~ 6)까지 게시물이 증가합니다.
  • i5 (i++에 의해 반환 됨)의 값을 가져옵니다.
  • i (5)의 값이 인쇄됩니다.
  • 아직까지는 6입니다.

    SO 또는 전체 인터넷 (단지 other way around)에 대한 설명을 찾을 수 없었습니다.

    여기에 무슨 문제가 있습니까?

    설명해주십시오.

    +2

    이것은 정의되지 않은 동작입니다. 참조 - http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors-i-i-i-i-etc –

    +3

    "그것은 있어야합니다 ...". 아니요, 정의되지 않았습니다. – Marlon

    +0

    나는 내 자신의 질문을 복제물로 표시하고있다. – SoonDead

    답변

    11

    중간에 시퀀스 포인트없이 개체에 두 번 이상 저장하는 것은 정의되지 않은 동작입니다.

    특히 3 단계와 4 단계에는 정의 된 순서가 없기 때문에 증분 (및 저장) 또는 저장소가 먼저 발생할 수 있습니다.

    +0

    시퀀스 포인트에 관한 위키 백과 문서를 읽은 후이를 수락합니다. – SoonDead