c++ 的一个基础问题

c_340705108 2011-09-19 02:13:12
#include <stdio.h>
void main()
{
int i=8;
printf("%d\n%d\n%d\n%d\n", ++i, --i, i++, i--);
}

这个程序的输出结果为什么是:8,7,8,8
谢谢你的回复!!
...全文
236 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zairenjian_1 2011-09-20
  • 打赏
  • 举报
回复
这个输出结果是和编译器有关。
苍蝇①号 2011-09-20
  • 打赏
  • 举报
回复
编译器的问题
君子美玉 2011-09-20
  • 打赏
  • 举报
回复
应该是变参函数解析时候的问题,和逗号应该没什么关系
tt630630 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 eckael 的回复:]
vc

C/C++ code

int i=8;
printf("%d\t%d\t%d\t%d", ++i, i--, i--, i--);


结果9 8 8 8
觉得后置++ --不改变i的值,只有前置++ --起作用
[/Quote]


后置 ++ -- 是在程序运行完后才改变i的值。
赵4老师 2011-09-20
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

不要写连自己也预测不了结果的代码!
支持英文数字 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cicigl 的回复:]

printf传进去的参数计算好像是从后往前的
i --,传进去8然后i = 7
i ++, 传进去7然后i = 8
++ i 和-- i 都是传进去的i的最终值,所以传进去的都是8
结果是8,8,7,8
[/Quote]以前没注意。现在注意了。
fmworld 2011-09-19
  • 打赏
  • 举报
回复
你debug跟踪一下就OK了哈。
FrankHB1989 2011-09-19
  • 打赏
  • 举报
回复
在ISO C99和ISO C++11中都是undefined behavior(ISO C++03有bug暂且不论),因为i相关的表达式产生超过一个没有明确被序列化的副作用。
就算不考虑这个问题(比如只是printf("%d\n%d\n", ++i, i;),结果也不确定,因为参数求值顺序是unspecified behavior,在同一个编译器编译的同一个程序的不同位置都可以不同,并且这点和入栈顺序无关(ISO C/C++管不了calling convention)。
翻越寒武 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 eckael 的回复:]
vc

C/C++ code


int i=8;
printf("%d\t%d\t%d\t%d", ++i, i--, i--, i--);


结果9 8 8 8
觉得后置++ --不改变i的值,只有前置++ --起作用
[/Quote]
说错了,后置++ --是改变了i的值,但printf只用了后置操作返回的临时值
最后i=6
翻越寒武 2011-09-19
  • 打赏
  • 举报
回复
vc

int i=8;
printf("%d\t%d\t%d\t%d", ++i, i--, i--, i--);

结果9 8 8 8
觉得后置++ --不改变i的值,只有前置++ --起作用
翻越寒武 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cicigl 的回复:]
printf传进去的参数计算好像是从后往前的
i --,传进去8然后i = 7
i ++, 传进去7然后i = 8
++ i 和-- i 都是传进去的i的最终值,所以传进去的都是8
结果是8,8,7,8
[/Quote]
这样解释是不对的
c_340705108 2011-09-19
  • 打赏
  • 举报
回复
五楼是对的 是在vc下运行的 可是为什么呀 就是从右到左的话 也是:8,7,7,8 吧
blueboy82006 2011-09-19
  • 打赏
  • 举报
回复
跟编译器有关哦。

GCC结果应该是8 7 7 8
LZ那个8 7 8 8的结果要在VC下才能得到吧。
波特王子 2011-09-19
  • 打赏
  • 举报
回复
C/C++函数入栈顺序是自右向左的,从最右边开始计算
clannadgirl 2011-09-19
  • 打赏
  • 举报
回复
从右往左算,
8 7 7 8
cicigl 2011-09-19
  • 打赏
  • 举报
回复
printf传进去的参数计算好像是从后往前的
i --,传进去8然后i = 7
i ++, 传进去7然后i = 8
++ i 和-- i 都是传进去的i的最终值,所以传进去的都是8
结果是8,8,7,8
cocoabird 2011-09-19
  • 打赏
  • 举报
回复
是8,8,7,8 逗号表达式是从右向左运行的

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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