2010-07-19 6 views
8

가능한 중복 :
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)후 증가 연산자 : 예기치 않은 동작이

내 코드는 다음과 같다 :

#include <stdio.h> 
int main() 
{ 
    int x = 10, y = 0; 
    x = x++; 
    printf("x: %d\n", x); 
    y = x++; 
    printf("y: %d\n", y); 
} 

가 후행 증가의 성격을 감안할 때, 나는 다음 출력을 기대할 수 있습니다 :

x: 10 
y: 10 

제 5 행에서 증가가 발생한 후 x을 초기 값으로 지정해야합니다. 이 나에게 신중한 선택처럼 보인다,

x: 11 
y: 11 

어셈블리에 파고 :

LCFI2: 
     movl $10, -4(%rbp) // this is x 
     movl $0, -8(%rbp) // this is y 
     incl -4(%rbp)  // x is simply incremented 
     movl -4(%rbp), %esi 
     leaq LC0(%rip), %rdi 
     movl $0, %eax 
     call _printf 
     movl -4(%rbp), %eax // now x is saved in a register, 
     movl %eax, -8(%rbp) // copied to y, 
     incl -4(%rbp)  // and finally incremented 
     movl -8(%rbp), %esi 
     leaq LC1(%rip), %rdi 
     movl $0, %eax 
     call _printf 

여기 무슨 일이야

대신하지만,이 얻을? GCC가 나 자신을 저축하려고합니까? 나는 편리한 언어 참조를 가지고 있지 않다. 그러나 이것은 의도 된 의미를 깨뜨릴 것이라고 생각했을 것이다.

+0

가증로 기록 될 것입니다! –

+0

http://en.wikipedia.org/wiki/Sequence_point – Ken

+0

옛날, 특정 언어의'a = 1 + a'는 모든 새로운 버그가 닥칠 광산이었습니다. –

답변

13

x = x++에 중간에 시퀀스 포인트가 없으므로 동작이 정의되지 않았습니다. C FAQ.

+0

고마워! 이전에 시퀀스 포인트를 알지 못했습니다. – danben

4

정확하게 포스트/선입관/감소가 발생할 때 C 언어에서 정의되지 않은 상태로 남습니다. 따라서 x = x++과 같은 문장은 잘 형성되지 않으므로이를 피하십시오.

+1

더 정확하게 표현식에서 변수를 두 번 이상 수정할 수 없습니다. 6.5/2 : * "이전의 순서 점과 다음의 순서 점 사이의 객체는 저장된 값을 최대 한 번 표현식의 평가로 수정해야합니다."* – sth

+2

@sth :보다 정확하게는 "시퀀스 포인트 사이에 둘 이상". 표현식에 시퀀스 포인트가 포함될 수 있습니다.이 경우 변수를 두 번 이상 수정하는 것이 좋습니다. 예를 들어,'&&','||'와 쉼표 연산자는 모두 하나의 표현식 안에 시퀀스 포인트를 형성 할 수 있습니다. –

+0

@sth : 심지어 정확히 말하면 _ 코더에 대한 제한 사항이 아니라 변수 자체에 대한 제한 사항입니다. 귀하가 "... 할 수 없다"는 진술은 정확하지 않습니다. 당신이 할 수있는 일은 아주 어리석은 일입니다 :-) – paxdiablo

1

당신이있을 때 : 무슨 일이 일어나고 있는지

a = b++; 

는 B가 저장되고의 할당은 완료 후 B가 하나씩 증가합니다. 당신이 할 그렇다면 :

x = x ++; 

이전에 x는 10 무엇이 일어날 것은 10 X에 저장됩니다 이후 (당신의 printf가 완료되기 전에) × (11)가 인쇄 된 이유 (11)에 의해 증가된다.

2

표준을 제외하고 (이것은 표준과 관련하여 정의되지 않았으므로) 실행 방법은 예상했던대로입니다.

엄지 손가락의 제 규칙은 x++와 라인, 당신은 xx++을 대체하고 (선행 증가 또는 이전 라인) 다음 줄에 x += 1을 넣어 것입니다. 엄지 손가락의 규칙에 따라

, 코드는

#include <stdio.h> 
int main() 
{ 
    int x = 10, y = 0; 
    x = x; // x: 10 
    x += 1; // x: 11 
    printf("x: %d\n", x); 
    y = x; // y: 11 
    x += 1; // x: 12 
    printf("y: %d\n", y); 
} 
관련 문제