This question already has answers here:
Why are these constructs using pre and post-increment undefined behavior?
(14 个回答)
3年前关闭。
考虑这个代码:
查看输出,似乎不是每次都从右到左评估参数。这里到底发生了什么?
更重要的是(因为它会导致未定义的行为,而不仅仅是未指定的行为),您通常不能在表达式中多次使用操作数来操作递增/递减运算符。那是因为:
(14 个回答)
3年前关闭。
考虑这个代码:
void res(int a,int n)
{
printf("%d %d, ",a,n);
}
void main(void)
{
int i;
for(i=0;i<5;i++)
res(i++,i);
//prints 0 1, 2 3, 4 5
for(i=0;i<5;i++)
res(i,i++);
//prints 1 0, 3 2, 5 4
}
查看输出,似乎不是每次都从右到左评估参数。这里到底发生了什么?
最佳答案
函数调用中参数的计算顺序未指定。编译器可以按照它可能决定的任何顺序评估它们。
来自 C99 标准 6.5.2.2/10“函数调用/语义”:
如果您需要确保特定的顺序,使用临时文件是通常的解决方法:
int i;
for(i=0;i<5;i++) {
int tmp = i;
int tmp2 = i++;
res(tmp2,tmp);
}
更重要的是(因为它会导致未定义的行为,而不仅仅是未指定的行为),您通常不能在表达式中多次使用操作数来操作递增/递减运算符。那是因为:
关于c - 如何在函数调用中评估参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2420685/
10-11 21:12