undefined behavior 동일한 변수를 시퀀스에서 한 번 이상 변경해야합니다. 그리고 이러한 이유 때문에 코드에 대해 다른 컴파일러를 사용하면 결과가 달라집니다.
나는 동일한 결과를 얻고있다. 내 컴파일러는 a = 150 and b = 6
이다.
a = ++b * ++b * ++b;
그리고 b
로
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
매크로 표현 a = CUBE(++b);
한 확대는 full expression.의 끝나기 전에 다시 한 번 다음 변경됩니다.
그러나 내 컴파일러가 낮은 수준 (이 비슷한 방식으로 컴파일러 일 수 있으며 동일한 기술로 시도 할 수 있음)이 표현식을 어떻게 변환합니까? 이를 위해 -S
옵션을 사용하여 소스 C를 컴파일하고 어셈블리 코드를 얻었다.
gcc x.c -S
파일은 x.s
입니다.나는이 검사에 내 대답
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $3, -8(%rbp) // b = 3
addl $1, -8(%rbp) // b = 4
addl $1, -8(%rbp) // b = 5
movl -8(%rbp), %eax // eax = b
imull -8(%rbp), %eax // 5*5 = 25
addl $1, -8(%rbp) // 6 `b` become 6 and
imull -8(%rbp), %eax // 6 * 25 = 150
movl %eax, -4(%rbp) // 150 assign to `a` become 150
movl $.LC0, %eax // printf function stuff...
movl -8(%rbp), %edx
movl -4(%rbp), %ecx
movl %ecx, %esi
movq %rax, %rdi
를 추가하고 왜 150
출력을 수행하는 방법을 알고 싶어하기 때문에 나는 부분 유용한 ASM 코드를 표시하고
이
(댓글를 읽기), 이잖아 어셈블리 코드 나는 a = 5 * 5 * 6
과 같은 표현을 이해할 수 있으므로 a
이 150
이되고 세 번째 증분이 b
이된다. 6
.
다른 컴파일러는 다른 결과를 생성하지만 난 생각하지만, 150
택시는이 b=3
에 대한 순서와 사용하는 어떤 컴파일러
5*5*6
에서 표현식을 평가? gcc 4.2.1을 사용하면 결과가 표시됩니다. a = 120, b = 6 –@Magnus : 어떤 결과라도 가능합니다. 'a = 120, b = 6' 또는'감자 '를 얻을 수 있습니다. 정의되지 않은 동작입니다. –