#include<stdio.h>
int main()
{
int a=2;
int j=++a + ++a + ++a + ++a ;
printf("%d",j);
}
//このフラグメントの実行を教えてください...//私はGCCubuntu(12.04)コンパイラを使用しています。-_-
アセンブリ コード (Windows 7 の Windows 用の gcc) [gcc -S test.c] を生成すると、次のようになります。
.file "increment.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "%d, %d\12\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB6:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
call ___main
movl $2, 28(%esp) ;28(%esp) = 2 (a=2)
incl 28(%esp) ;28(%esp) = 3 (a++)
incl 28(%esp) ;28(%esp) = 4 (a++)
movl 28(%esp), %eax ;%eax = 4 (eax = a = 4)
leal (%eax,%eax), %edx = %eax + %eax = 8 (edx = a + a)
incl 28(%esp) ;28(%esp) = 5 (a++)
movl 28(%esp), %eax ;%eax = 5 (eax = a = 5)
addl %eax, %edx ;%edx = %eax + %edx = 5 + 8 = 13 (edx = a + a + a)
incl 28(%esp) ;28(%esp) = 6 (a++)
movl 28(%esp), %eax ; %eax = 6 (eax = a = 6)
addl %edx, %eax ;%eax = %edx + %eax = 13 + 6 = 19 (eax = a + a + a + a)
movl %eax, 24(%esp)
movl 28(%esp), %eax
movl %eax, 8(%esp)
movl 24(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE6:
.def _printf; .scl 2; .type 32; .endef
結果を計算した後 (コメントを参照)、printf 関数が結果として 19 で呼び出されます。
とにかく、異なるコンパイラは異なる結果をもたらす可能性があります。最終的な結果は、コンパイラが命令を配置する方法によって異なります。