这个问题已经有了答案:
Parameter evaluation order before a function calling in C [duplicate]
7答
我正在编写C和I中的非破坏性转换例程,刚刚意识到(至少在Visual C++中)函数以相反的顺序解决。
所以:

main()
{
char* psString[] = { "Hello", "World", "World2", "World3" };

printf("%s - %s - %s - %s\n",
    H2A_N(psString[0]),
    H2A_N(psString[1]),
    H2A_N(psString[2]),
    H2A_0(psString[3]));

return 1;
};

我的代码不是可重入的,只在一个线程中运行,所以我打算使用一个静态字符数组来存储结果。
我的计划是使用一个函数h2a_0,它将输出写到缓冲区的开头,并留下下一个地址,以便以后调用h2a_n。
我确实认识到这种方法有一些缺点,但是我必须将这个转换例程应用到许多现有代码中,这样越简单越好(我不想把内存释放掉)。
我的问题是:
以相反的顺序解析函数(当它们作为参数传递给其他函数时)是C标准的一部分吗?
有更好的办法吗?

最佳答案

参数的求值顺序没有定义。编译器可以随心所欲地决定计算它们的顺序。
最新版本的标准C11这样说,§6.5.2.2/10:
在函数指示符和实际值的计算之后有一个序列点
但在实际调用之前。调用函数中的每个求值(包括
其他函数调用)在
被调用函数主体的执行是按照
被调用函数的执行。
如果希望强制特定的求值顺序,则需要从函数调用中提取表达式,并将它们保存到局部变量中。

int param1 = foo(...);
int param2 = bar(...);
DoSomething(param1, param2);

有更好的办法吗?
很可能。拥有函数返回值并对固定长度静态分配的缓冲区应用副作用通常不被认为是最佳实践。但是,我不想告诉你如何解决你的问题,因为我对这个问题了解不够。

10-07 13:01
查看更多