printf的处理

本文深入探讨了C语言中`printf`函数参数的求值顺序及其对栈操作的影响,解释了前置和后置操作符的执行方式,并通过实例展示了不同编译器的具体实现差异,最后提供了如何通过反汇编查看求值顺序的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>


int main()
{
int i = 1;
printf("%d,%d,%d", i, i - 1, i + 1);
return 0;
}
// 编译器先计算i+1的结果,为2,进栈
// 再计算i-1的结果,为0,进栈
// 计算i的结果,为1,进栈

// 依次出栈,输出结果为1,0,2


#include <stdio.h>
int main()
{
int i = 1;
printf("%d,%d,%d", i--, i++, ++i);
return 0;
}
// i=1,编译器先计算++i的结果,为2,进栈
// i=2,再计算i++的结果,为2,进栈
// i=3,计算i--的结果,为3,进栈
// 依次出栈,输出结果为3,2,2


注:VC6中的printf中的后置操作是跳出printf才执行的。
再注:以上是printf函数的参数压栈顺序,与编译器具体实现有关。VS2008我测试了下,基本和上面情况吻合,但是我还是找出了反例,也就是不符合上面的结论。
再注:这是一个“未定义”的求值顺序问题,C99标准里专门有一条讲的这个问题。还可以参考cert的C++安全编程规范第10条:
https://www.securecoding.cert.org/confluence/display/seccode/EXP10-C.+Do+not+depend+on+the+order+of+evaluation+of+subexpressions+or+the+order+in+which+side+effects+take+place
再再注:
如果你想知道你的编译器是怎样的求值顺序,可以反汇编看其代码。
如果你是想通过这种方法来达到你的求值目的,,千万别这么做。。


原文地址:http://www.bcwhy.com/thread-2182-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值