可能重复:
Parameter evaluation order before a function calling in C
对于下面的代码,我预计输出为20和76,而75和21将作为输出。请解释为什么会这样。
#include<stdio.h>
unsigned func(unsigned n)
{
unsigned int a =1 ;
static unsigned int b=2;
a+=b; b+=a;
{
unsigned int a=3;
a+=b; b+=a;
}
//printf("%d %d ",a,b);
return (n+a+b);
}
int main()
{
printf("%d %d\n",func(4),func(5));
return 0;
}
答案 0 :(得分:10)
您希望在func(4)
之前调用func(5)
,但编译器会发生相反的情况。 C标准的功能参数评估顺序为未指定。因此,编译器可以自由选择首先调用哪个函数。因此,在不同的运行中,您可能会观察到不同的函数调用顺序,尽管使用相同的编译器不太可能发生这种情况。
答案 1 :(得分:3)
func(4)和func(5)的评估顺序不是由C标准定义的。
答案 2 :(得分:2)
表达式的评估顺序为unspecified behaviour
,因此func(4)
和func(5)
的调用顺序可能不同于
您可能希望访问它以获取更多信息
答案 3 :(得分:1)
参数以相反的顺序被压入堆栈。在您的编译器实现中,func(5)
之前会调用func(4)
。
答案 4 :(得分:1)
评估顺序可能是原因。因为,
//printf("%d %d\n",func(4),func(5));
printf("%d \n",func(4));
printf("%d \n",func(5));
打印
20
76
答案 5 :(得分:0)
func(5)首先被执行:
执行func(5)后的变量值:
a = 3
b = 13
func(5) = 21
因为,b是静态的,执行func(4)后的值:
a = 14
b = 57
func(4) = 75
答案 6 :(得分:0)
代码很简单,并且记住static
变量将在函数调用之间保留它们的值。
在您的程序中,由于您的编译器(因此编译器特定,未由标准定义):
func(5)
首先执行,:返回21 ..
解释:
unsigned func(unsigned n) /*first with 5*/
{
unsigned int a =1 ;
static unsigned int b=2;
a+=b; b+=a; // a = 3, b = 5
{
unsigned int a=3;
a+=b; b+=a; // a = 8, b = 13
}
//printf("%d %d ",a,b);
return (n+a+b); // 5 + 3 + 13 = 21.
}
接下来执行func(4),
说明:
unsigned func(unsigned n) /*first with 5*/
{
unsigned int a =1 ;
static unsigned int b=2;
a+=b; b+=a; // a = 14, b = 27
{
unsigned int a=3;
a+=b; b+=a; // a = 30, b = 57
}
//printf("%d %d ",a,b);
return (n+a+b); // 4 + 57 + 14 = 75(which is printed first).
}
因此输出。
答案 7 :(得分:0)
这个称为“功能副作用”的术语是众所周知的。您更改函数内部的变量,调用函数并依赖于使用变量的语句,期望它已经更改。通常这应该避免,并不是一个好方法。
在这种情况下,更好的替代方法是调用函数并存储返回值,然后在printf中使用它们或进行两次不同的printf调用。