解释int a=9;printf("%d,%d",a,a++)?输出情况

结论取自知乎前辈:

任何在同一个表达式内多次使用++/--的C语言题目都无助于你学习C语言。

这种行为是未定义的行为,换句话说,结果是多少是不确定的。不要过分去研究这类题目,没有意义。同时正确的代码里也不应该有这种不确定结果的表达式出现,在项目代码里,一般来说都严格禁止这样使用。

下面解释原因:

首先,printf的入栈顺序是从右到左,任何一个标准库的printf都是这样的,否则printf无法在栈顶取到最左边的第一个参数。

那么,你的这个题目的一种可能的运行状态是:

1.a的值,入栈(右边第一个参数),此时a的值是92.a执行++操作;
3.a的值,入栈(右边第二个参数),此时a的值是104. 参数"%d,%d"(指针),入栈;
5. 调用printf

所以输出的结果就是10,9

但以上只是一种可能的运行状态。

也可能是下面这种:

1.a的值,入栈(右边第一个参数);
2.a的值,入栈(右边第二个参数);
3. 参数"%d,%d"(指针),入栈;
4.a执行++操作;
5. 调用printf

因为编译器可能优化代码,如果是这种情况,那么输出结果就是9,9

因为C标准里没有规定具体++执行的时间点在哪,所以这种问题没有标准答案。

再说一句,实际项目工程代码里,禁止用这种有歧义的写法。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值