main()
{
int i=5;
printf("%d%d%d%d%d%d",i++,i--,++i,--i,i);
}
Run Code Online (Sandbox Code Playgroud)
输出是45545,但我不知道它是如何工作的.有人说函数调用中的参数从左到右被压入堆栈.
Mak*_*zin 19
未指定函数参数的评估顺序.
从c99标准:
6.5.2.2函数调用
10 /函数指示符的评估顺序,实际参数和实际参数中的子表达式是未指定的,但在实际调用之前有一个序列点.
然而,这只是问题的一部分.另一件事(实际上更糟糕,因为它涉及未定义的行为)是:
6.5表达式
2 /在上一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次.此外,先前的值应该只读以确定要存储的值.
在我们的例子中,所有参数评估仅在2个序列点之间:;输入函数之前和之前的点,但是在评估了所有参数之后.你最好不要写这样的代码.
在某些地方,C标准相当宽松,为编译器可能做的优化留出了空间.
| 归档时间: |
|
| 查看次数: |
13091 次 |
| 最近记录: |