gpt4 book ai didi

c 函数参数求值顺序

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:09 24 4
gpt4 key购买 nike

我知道无法保证函数参数的调用顺序,但是,是否可以保证如果有函数调用作为参数,则该函数将首先被调用?

我在实验室帮助学生学习编程入门类(class),他们应该创建一个递归阶乘函数,该函数接收 n(对于 n!)和一个指向整数的指针,该整数将用于计算函数调用和然后他们应该打印结果(n,n!和计数)。

很多人提示他们使用指针是错误的,所以我看了一下代码,他们都是这样的:

int fat(int n,int *count)
{
(*count)++;
if(n>1)
{
return n * fat(n-1,count);
}

return 1;
}

int main()
{
int n, count=0;
do
{
printf("Write n for fat (n >= 0): ");
scanf("%d", &n);
}while(n<0);

printf("Input: %d. Output: %d.\nFunction called %d times.\n\n", n, fat(n, &count), count);
printf("%d times\n",count);

return 0;
}

用 gcc (Debian 4.7.2-5) 4.7.2 编译输出是:

Write n for fat (n >= 0): 4
Input: 4. Output: 24.
Function called 0 times.

4 times

因此,如果 fat 应该先运行,“Function called...”应该打印“Function called 4 times”而不是 0。

所以,我的问题是:

即使保证参数中的函数调用将在“接收”函数调用之前运行,但仍然不确定它是否在查看不是函数调用的参数之前运行?

另一个奇怪的事情是,同样的代码在 xcode 上打印“Function called 4 times”...

最佳答案

isn't it guaranteed that if there's a function call as parameter, that function will be called first?

保证在如下调用中:

f(g(), h)

g 将在调用 f 之前调用。但是,不能保证 gh 被求值之前被调用。

通常,如果您关心两件事中哪一件先发生,请将它们放在单独的语句中。这样,您就不必记住先序后序的关系或想知道副作用何时会发生。

关于c 函数参数求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21600108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com