首页 > 解决方案 > 尝试从 printf 语句中的函数打印静态变量时出现奇怪的输出

问题描述

我尝试打印静态变量的值 5 次,方法是在一个函数中声明它,每次调用它都会自增,然后将其添加到全局变量并在 printf 语句中返回它的值,但输出与通常的静态变量的所有值不同变量首先递增,添加到全局变量后输出顺序相反(所有值都使用单个 printf 语句打印)

#include <stdio.h>

int global_variable = 10;

int fun(){
    static int var;
    printf("The value of var is %d\n", var);
    var++;
    return global_variable + var;
}

int main()
{
    //This works fine
    printf("%d\n", fun());
    printf("%d\n", fun());
    printf("%d\n", fun());
    printf("%d\n", fun());
    printf("%d\n", fun());

    //This works weird this prints value in reverse order not like the former case
    printf("\n%d\n%d\n%d\n%d\n%d\n",fun(), fun(), fun(), fun(), fun());

    return 0;
}

第一个的输出:

The value of var is 0
11
The value of var is 1
12
The value of var is 2
13
The value of var is 3
14
The value of var is 4
15

第二个的输出:

The value of var is 5
The value of var is 6
The value of var is 7
The value of var is 8
The value of var is 9

20
19
18
17
16

在两组代码中,第一个工作正常,但第二个是我不明白的。请解释。

标签: cfunctionstatic-variables

解决方案


未指定函数参数的评估顺序。这意味着它们可以按任何顺序进行评估。

C 标准中关于函数调用的第 6.5.2.2p10 节规定:

在函数指示符和实际参数的评估之后但在实际调用之前有一个序列点。调用函数(包括其他函数调用)中的每个求值,如果在被调用函数的主体执行之前或之后没有特别排序,则相对于被调用函数的执行是不确定的。

在这种情况下,func在给定的表达式中不要多次调用是正确的,或者更准确地说,在没有中间序列点的情况下不要多次调用。


推荐阅读