2 plklklklkl plklklklkl 于 2015.06.26 12:22 提问

c语言 printf gcc和vs010输出不一样

3 #include
4
5 int main(void)
6 {
7 unsigned char b = 0;
8 unsigned char a = 0;
9 printf("%d\t%d\t%d\t%d\n",a,++a,++a,++a);
10 printf("%d\t%d\t%d\t%d\n",b,b++,b++,b++);
11 }

gcc输出:
3 3 2 1
3 2 1 0 //符合我们的逻辑
vs2010输出:
3 3 3 3 //为什么是3 3 3 3啊?
3 2 1 0

3个回答

wangyaninglm
wangyaninglm   Ds   Rxr 2015.06.26 13:47

这个其实没啥好疑惑的,编译器实现不同吧,感觉不用深究,单步跟进去看下就行了

zxh707wk
zxh707wk +1,在实际编程中最好不要这样写,自己麻烦还容易让别人搞错
2 年多之前 回复
rogone
rogone   2015.06.26 14:01

我猜
printf("%d\t%d\t%d\t%d\n",a,++a,++a,++a);被编译器处理成
++a;
++a;
++a
printf("%d\t%d\t%d\t%d\n",a,a,a,a);

printf("%d\t%d\t%d\t%d\n",b,b++,b++,b++);被处理成
unsigned char t0 = b++;
unsigned char t1 = b++;
unsigned char t2 = b++
printf("%d\t%d\t%d\t%d\n",b,t2,t1,t0);

++a是左值,b++是右值,应该是vs编译器对于左值参数做了优化,在计算参数的表达式后没有用临时变量代替其入栈,节约内存
纯属猜测

vdsvfdsbfdgf
vdsvfdsbfdgf   2015.06.26 14:45

编译器不同,就像两个人想法都不一样了,结果怎么会一样呢

Csdn user default icon
上传中...
上传图片
插入图片