今天我看到了printf()
函数的匿名行为。
任何人都可以告诉我为什么它的表现如此。
是printf()
内的函数执行是否相反?
请解释一下或分享一个有用的链接。
我的代码
#include <stdio.h>
int fun(){
static int c=15;c++;
return c;
}
int main()
{
printf("%d %d %d",fun(),fun(),fun());
}
实际产量:18 17 16 预期产出:16 17 18
编辑2: 我更注意到它的行为不仅包括函数,还包括变量
#include <stdio.h>
static int c=15;
int fun(){
c++;
return c;
}
int main()
{
printf(" %d %d %d %d %d",c,fun(),fun(),fun(),c);
}
实际产量:18 18 17 16 15 预期产出:15 16 17 18 18
提前致谢:)
答案 0 :(得分:2)
参数的评估顺序是未指定。这意味着它依赖于编译器实现。您示例中的实际顺序似乎是:
printf("%d %d %d",fun(),fun(),fun());
/* (3) (2) (1) */
但这是任意的,很可能是6种可能中的任何一种。
答案 1 :(得分:2)
int main()
{
int a, b, c;
a = fun();
b = fun();
c = fun();
printf("%d %d %d", a, b, c);
}
你得到了你需要的东西。
参数评估顺序由编译器控制,但语句评估顺序由您控制。
答案 2 :(得分:1)
由于static
变量而出现此行为。您可能知道函数内的静态变量在调用之间保持其值。
因此,之前对函数fun()
的调用所改变的变量仍然用于稍后调用该函数。而价值混乱的原因是 -
The order that function parameters are evaluated is an unspecified behavior. 只能确保在调用函数之前必须完全评估所有参数。
的此链接答案 3 :(得分:0)
这里提出了类似的问题: Parameter evaluation order before a function calling in C
基本上,编译器可以按任意顺序自由地评估函数的参数。
当被问及C中常见的未定义行为时,一位用户回答了with this,这也回答了您的问题。
答案 4 :(得分:0)
函数的参数未在标准中定义的顺序,并由编译器使用的调用约定确定。
您可以参考this
答案 5 :(得分:-1)
我运行程序,并获得输出18 17 16
。
这意味着从右到左运行不同的fun()
。
但是,它仍然是一种未定义的行为。它们的顺序在C中没有明确定义,它取决于编译器。