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,在实际编程中最好不要这样写,自己麻烦还容易让别人搞错
大约 3 年之前 回复
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
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
printf 重定向
usart这部分代码我也是从网上copy出来的,一下是作者的解释: 简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式),  标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数.  例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: 
linux下编译C程序执行C程序 printf没有输出
linux下编译C程序执行C程序 printf没有输出
控制台程序的中文输出乱码问题,printf,wprintf与setlocale
#include #include int main(void) { char str[] = "中文"; wchar_t wstr[] = L"中文"; printf("1:%s\n", str); wprintf(L"2:%s\n", wstr); return 0; }
C语言printf("%d",15.0/2)结果为0
最近刚学C,早晨碰到问题,printf("%d",15.0/2)结果为0 ,原来printf不会执行类型转换。printf调用时,将参数入栈,最后只能看到栈顶的参数,就是printf的第一个参数,然后解析这个字符串,再去栈里挨个找参数,比如printf("%d%d\n", a, b);解析字符串,看到%d时,那么先从栈顶向下偏移一个字符串指针的长度,就是整形数int的位置了,从栈里当前指针的位置到
打印结果和调试结果不一样(C语言)
【0】README0.1)本文旨在阐述 个人的debug经历,遇到的各种debug 奇葩问题, 说是奇葩,其实也是自己 不小心或者说是编程习惯不好;【1】debug和running的运行结果不一致(乍眼一看,你肯定醉了)1.1)原因:这是因为, 运行是时候,temp内部分配失败,为null, 所以直接返回了,所以swap失败;而在debug的时候, temp内存分配成功, 不为null, 所以swa
关于C语言中printf()变量++/--输出值得注意的问题
#include main() { int x=1; printf("%d,%d,%d,%d",++x,++x,++x,x); } 输出结果为:4,3,2,1 ------------------------------------------------------------------------------------------- ----------------
c语言的printf输出浮点数的一些问题
在printf时:如果以%f格式输出,将输出8个字节(scanf输入时,%f是4个字节)                    在参数入栈时如果是float型或者double型 直接入栈8个字节,此时输出及后续输出都没问题                     但如果参数小于8个字节且不是float型:比如int   shor int  ,就会扩展符号位,成为4个字节再入栈,但是输出的是8个
LINUX C 输出重定向例子
输出重定向
关于gcc编译后的带中文输出的utf-8的c文件输出乱码问题
gcc 好像不能成功编译utf-8编码格式的c语言文件。 只要把c语言文件
gcc 编译器中 printf i++ 和 ++i 的输出
gcc 编译器中 printf i++ 和 ++i 的输出