printf中的匿名行为

时间:2015-06-02 04:21:01

标签: c printf

今天我看到了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

提前致谢:)

6 个答案:

答案 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. 只能确保在调用函数之前必须完全评估所有参数。

您可以查看some common undefined behavior in C and C++

的此链接

答案 3 :(得分:0)

这里提出了类似的问题: Parameter evaluation order before a function calling in C

基本上,编译器可以按任意顺序自由地评估函数的参数。

当被问及C中常见的未定义行为时,一位用户回答了with this,这也回答了您的问题。

答案 4 :(得分:0)

函数的参数未在标准中定义的顺序,并由编译器使用的调用约定确定。

您可以参考this

答案 5 :(得分:-1)

我运行程序,并获得输出18 17 16

这意味着从右到左运行不同的fun()

但是,它仍然是一种未定义的行为。它们的顺序在C中没有明确定义,它取决于编译器。