请教一下printf这个函数

emoshusheng 2010-11-07 08:57:14
遇到一个关于printf函数的问题,向大家请教一下。
我在Windows下调用了printf函数,调用如下:printf(“%d,%d”,++i,i++);i的初值为1,在vc6.0下运行的结果为2,1 可是在vs2010下运行结果为3,1 能解释一下为什么嘛???
还有一点就是在vc6.0下为什么是2,1怎么不是2,2啊???
...全文
227 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
elegant87 2010-11-09
  • 打赏
  • 举报
回复
这个跟编译器有关系的
crazy_yangyf 2010-11-09
  • 打赏
  • 举报
回复
这个和具体的编译器的实现有关,从编译原理学习的理论来说,是从左往右入函数栈的
luciferisnotsatan 2010-11-09
  • 打赏
  • 举报
回复
编译器决定的
emoshusheng 2010-11-09
  • 打赏
  • 举报
回复
各位朋友谢谢大家的解释,这两天断网没能及时和大家交流sorry哈。
xspace_time 2010-11-09
  • 打赏
  • 举报
回复
很显然输出与编译器有关,与其它东西无关,所以建议你去看看《编译原理》
huoguangyu 2010-11-09
  • 打赏
  • 举报
回复
楼上的各位好象没有学过C 语言!说话要负责!说的什么乱七八糟的!
"编译器的问题 不同的编译器结果不一样".这句话就是放屁!同样的程序结果不一样那么世界不就乱套了!
不懂不要乱说!
这位兄弟又拿汇编代码吓唬人了!!

该问题涉及到2个问题:

1. printf函数的结合方式 : 自右向左 也就是先执行 i++, 后执行 ++i,
2. 自加运算 ++i, 与 i++ 的含义及其区别, i++ 是先使用i的值,然后自加1
++i , 则是将 i自加1之后,再使用;
++i 的效率要比 i++ 高许多,原因是 i++ 需要一个临时的变量来保存 i原先的值,然后调用 ++i

我们可以认为:
i++
分3步:
int j = i;
++i; //从这里可以看出,其实i++调用了i++,
return j;
这个解释是正确的!
觉醒之刃 2010-11-08
  • 打赏
  • 举报
回复
你如果有兴趣知道原因 应该去简单的了解一下汇编语言 以及编译的基本流程
lht1936 2010-11-08
  • 打赏
  • 举报
回复
gcc的话是3,1
GIantPerson 2010-11-08
  • 打赏
  • 举报
回复
i++ 先使用i的值再加加,++i先加加再使用。这个没有错,只是不知道其所以然?
FrankHB1989 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 athenacle_ 的回复:]

LZ要注意看书上的什么i++是什么先用i的值在+1,++1是先i加一,在用i的值这种问题。。
在一条语句中,不允许多条自增,自减的语句存在,否则会发生未定义的行为~。完全取决于编译器~

[/Quote]

概念有误,是unspecified behavior,不是undefined behavior。
ISO C99 Annex J.1:
— The order in which subexpressions are evaluated and the order in which side effects
take place, except as specified for the function-call (), &&, ||, ?:, and comma
operators (6.5).
赵4老师 2010-11-08
  • 打赏
  • 举报
回复
不要写连自己也预测不了结果的代码!
赵4老师 2010-11-08
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
yaganblw 2010-11-08
  • 打赏
  • 举报
回复
完全取决于编译器~
wangchensong 2010-11-08
  • 打赏
  • 举报
回复
这就是没有意义的代码啊,为什么要写呢,如果你跟人看这种代码,人家会笑你外行的,因为这样写代码是不允许的,我是学软件的,我们老师是不允许我们写这样的代码的.
dumbly 2010-11-08
  • 打赏
  • 举报
回复
ls各位说的正确,确实是由编译器决定的,具体实现不同,结果可能不同
vagent 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 athenacle_ 的回复:]

LZ要注意看书上的什么i++是什么先用i的值在+1,++1是先i加一,在用i的值这种问题。。
在一条语句中,不允许多条自增,自减的语句存在,否则会发生未定义的行为~。完全取决于编译器~

这个东东,要是在VC++2010 Release模式运行下,就会输出2,1。。。很强大~

LZ看:源程序C/C++ code

#include <stdio.h>

int main(void)……
[/Quote]



这位兄弟又拿汇编代码吓唬人了!!

该问题涉及到2个问题:

1. printf函数的结合方式 : 自右向左 也就是先执行 i++, 后执行 ++i,
2. 自加运算 ++i, 与 i++ 的含义及其区别, i++ 是先使用i的值,然后自加1
++i , 则是将 i自加1之后,再使用;
++i 的效率要比 i++ 高许多,原因是 i++ 需要一个临时的变量来保存 i原先的值,然后调用 ++i

我们可以认为:
i++
分3步:
int j = i;
++i; //从这里可以看出,其实i++调用了i++,
return j;
nwysb19860215 2010-11-08
  • 打赏
  • 举报
回复
TC编译也是3,1
看来由编译器决定
xiaoxiaoyu03 2010-11-08
  • 打赏
  • 举报
回复
真是长见识了。
子庚 2010-11-08
  • 打赏
  • 举报
回复
c语言标准并没有规定函数参数的求值顺序,所以lz的这个题只是和特定的编译器有关.我们写程序时,尽量不要写这样的代码.
Metrosexual 2010-11-08
  • 打赏
  • 举报
回复
编译器的问题 不同的编译器结果不一样
加载更多回复(9)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧