C++里面的print()函数的问题

本文探讨了C语言中函数参数处理的顺序问题,通过具体的示例解释了printf函数和其他函数如何处理多个参数的情况,揭示了参数压栈及处理过程导致的输出顺序反转现象。

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

今天碰到这么一个问题,程序是这样的:
#include <stdio.h> 
int f(int a, int b, int c)
{
	return 0;
}
int main()
{
	return f(printf("a"), printf("b"), printf("c"));
}

很简单的程序对吧,我开始以为输出“abc”,结果输出为“cba”。(不会有人认为编译不过吧?)

我查了很多资料,先不看我这个程序,我们先看看下面那个哥们的程序,文章在http://blog.sina.com.cn/s/blog_8d3652760100x1x1.html

里面说到了printf打印多个参数的处理情况,其实print把参数一个个压到栈里,然后把参数一个个从栈头取出来处理,处理完了之后再从栈底进行打印,整个过程就是这样的。

比如他里面的这句话:

printf("%d, %d, %d, %d, %d, %d\n",++i,++i,++i,++i,++i,++i);

暂定第一到第六分叫i(1)~i(6)吧,开始i的初始值为8;

程序先腾出一个空间来,把i(1),i(2),i(3),i(4),i(5),i(6)分别压入,然后开始处理了i(6)的那个空间值为i++即为9,i(5)的那个空间值为i++即为10,

i(4)的那个空间值为i++即为11,……,一直到i(1)的那个空间值为i++即为14。好的,现在已经把栈里的数据处理完了,开始打印了,打印则又从左边i(1)的地方开始,打印出来为14131211109。

好了,现在回到我最上面的那段程序,有人会奇怪,对啊,我这个程序printf里面只有一个字符变量啊,那肯定是顺序执行就好了。但是不是的!!!

f(int a, int b, int c)函数也是按照压栈的形式处理的!!!这种处理方式在程序里比比皆是。
f()函数也是先将变量a,b,c 压入,然后运行c这块是什么啊,哦,c这块是print(“c”)好吧,那我就首先运行print(“c”)之后把它放在c这个变量的空间吧(这时已经打印了c到屏幕上了),接着是b,a。最后好了,我们运行再运行f()函数体,但是函数体里面什么都没有,好吧,那就这样返回吧。程序结束。</span>
所以结果是“cba”。
### C++ 中的打印输出方法 在 C++ 中,`std::cout` 是最常用的输出流对象,用于向标准输出(通常是控制台)发送数据。通过 `<<` 流操作符可以方便地将各种类型的变量或表达式的值输出到屏幕上。 #### 使用 `std::cout` ```cpp #include <iostream> int main() { std::cout << "Hello, World!" << std::endl; return 0; } ``` 这段代码展示了如何使用 `std::cout` 输出字符串 `"Hello, World!"` 并换行[^1]。 对于更复杂的场景,比如传递多个参数给一个自定义的打印函数: ```cpp void print(int a, int b, int c) { std::cout << a << ", " << b << ", " << c << std::endl; } int main() { std::tuple<int, int, int> t = {1, 2, 3}; std::apply(print, t); return 0; } ``` 这里展示了一个例子,其中定义了接受三个整数作为参数的 `print()` 函数,并利用 `std::apply` 将元组中的元素解包传入该函数。 另外,在某些情况下可能需要创建具有特定签名的函数指针来调用不同形式的目标函数: ```cpp // 定义普通函数 void print(int num, const std::string& name) { std::cout << "num:" << num << " name:" << name << std::endl; } // 定义函数指针类型并初始化 using funPtr = void(*)(int, const std::string&); funPtr fun1 = print; int main() { fun1(42, "example"); return 0; } ``` 此片段说明了怎样声明和使用指向成员函数的指针以及如何将其绑定至具体的实现版本[^2]。 最后还可以采用 lambda 表达式的方式简化匿名内联函数的编写过程: ```cpp #include <iostream> int main() { using namespace std; int n = [](int x, int y)->int{return x + y; }(5, 4); cout << n << endl; return 0; } ``` 上述实例中运用了立即执行的形式定义了一次性的加法运算逻辑,并直接获取其返回的结果进行显示[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值