void main()
{
int a = 0, b = 0;
printf("%d,%d,%d \n",a++,++a, a++); //2 2 0 //2 3 0
getchar();
}
@user,看起来结果跟编译器的代码生成方式有关。我用GCC 5.4编译这个代码,无论优化等级开到多少,结果都是2,3,0
。
-O0
是没有任何优化(相当于Debug模式),-O3
是最高等级优化。
# gcc -O0 main.c -o main; ./main
2,3,0
# gcc -O1 main.c -o main; ./main
2,3,0
# gcc -O2 main.c -o main; ./main
2,3,0
# gcc -O3 main.c -o main; ./main
2,3,0
# gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-O0
优化下生成的汇编代码(Intel语法):
# gcc -O0 -c -g main.c; objdump -S -M intel ./main.o
./main.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
#include <stdio.h>
void main()
{
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
4: 48 83 ec 10 sub rsp,0x10
int a = 0, b = 0;
8: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0
f: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0
printf("%d,%d,%d \n",a++,++a, a++); //2 2 0 //2 3 0
16: 8b 55 f8 mov edx,DWORD PTR [rbp-0x8]
19: 8d 42 01 lea eax,[rdx+0x1]
1c: 89 45 f8 mov DWORD PTR [rbp-0x8],eax
1f: 83 45 f8 01 add DWORD PTR [rbp-0x8],0x1
23: 8b 45 f8 mov eax,DWORD PTR [rbp-0x8]
26: 8d 48 01 lea ecx,[rax+0x1]
29: 89 4d f8 mov DWORD PTR [rbp-0x8],ecx
2c: 8b 75 f8 mov esi,DWORD PTR [rbp-0x8]
2f: 89 d1 mov ecx,edx
31: 89 f2 mov edx,esi
33: 89 c6 mov esi,eax
35: bf 00 00 00 00 mov edi,0x0
3a: b8 00 00 00 00 mov eax,0x0
3f: e8 00 00 00 00 call 44 <main+0x44>
}
44: 90 nop
45: c9 leave
46: c3 ret
[聊天-网站建设_网页设计] a676774305:安装双系统,这里该选哪一个呢?就是该选几号图吖? 已经安装好了WIN 7系统,正在安装第二个Ubun…
php 的话是0 2 2...斗图专属版