c - 尝试从 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
在两组代码中,第一个工作正常,但第二个是我不明白的。请解释。
解决方案
未指定函数参数的评估顺序。这意味着它们可以按任何顺序进行评估。
C 标准中关于函数调用的第 6.5.2.2p10 节规定:
在函数指示符和实际参数的评估之后但在实际调用之前有一个序列点。调用函数(包括其他函数调用)中的每个求值,如果在被调用函数的主体执行之前或之后没有特别排序,则相对于被调用函数的执行是不确定的。
在这种情况下,func
在给定的表达式中不要多次调用是正确的,或者更准确地说,在没有中间序列点的情况下不要多次调用。
推荐阅读
- reactjs - 将数据添加到我的 firebase firestore 后端数据库后重新渲染反应组件
- meteor - 阿波罗 3 号、流星和“没有光纤就无法等待”
- macos - Mac Endpoint 安全性 - 防止用户删除钥匙串项目
- telegraf - Telegraf 间歇性处理器.regex
- angular - 在 PRIMENG p-inputNumber 中的逗号分隔符后自动移动光标
- java - 比较 Kotlin 中的 Calendar 和 LocalDate
- php - 如何在 mailgun 模板中添加变量
- c++ - 哪些因素决定了使用 g++ 构建的二进制文件需要哪个版本的 glibc?
- vb.net - 如何在 VB.NET 中使用可嵌入水晶报表设计器控制器
- c# - 从列表中选择一种材料,将其存储,然后将该材料作为新材料返回