我以为我已经理解了如何正确地增加C中的值,直到我运行这段代码。正如我们从输出中看到的那样,static_var不断增加。然而,情况并非如此。我认为var也应该每次增加1。
如果我要将int var
更改为static int var
,那么var
会继续增加。也许我没有正确思考。如果有人可以清楚地说明为什么" var不会继续增加每个,这太棒了!
#include <stdio.h>
void function() {
int var = 5;
static int static_var = 5;
printf("\t[in function] var = %d\n", var);
printf("\t[in function] static_var = %d\n", static_var);
var++;
static_var++;
}
int main() {
int i;
static int static_var = 1337;
for(i=0; i < 5; i++) {
printf("[in main] static_var = %d\n", static_var);
function();
}
}
输出:
[in main] static_var = 1337
[in function] var = 5
[in function] static_var = 5
[in main] static_var = 1337
[in function] var = 5
[in function] static_var = 6
[in main] static_var = 1337
[in function] var = 5
[in function] static_var = 7
[in main] static_var = 1337
[in function] var = 5
[in function] static_var = 8
[in main] static_var = 1337
[in function] var = 5
[in function] static_var = 9
答案 0 :(得分:2)
问题在于范围。在函数中定义变量var时,它会为使用该名称的块创建一个新变量。编译器将该函数映射中对var的所有引用都设置为新变量。它以这种方式工作,因为该语言假设如果您创建了一个具有较小范围的同名新变量,那么您必须具有它。如果要访问main和in函数中的静态变量,则需要在任一函数之外的全局范围内声明它。
答案 1 :(得分:1)
您编写的代码基本上等同于此
static int static_var_from_function = 5;
void function() {
int var = 5;
printf("\t[in function] var = %d\n", var);
printf("\t[in function] static_var = %d\n", static_var_from_function);
var++;
static_var_from_function++;
}
您的static_var
等同于文件范围变量(如果愿意,则为“全局变量”),在程序启动时只创建一次(初始值为5
)。这个变量永远存在,永远保持其最后的价值。这就是为什么每次进入函数时都会看到它连续递增的原因。
同时,var
是一个局部变量,每次进入函数时都会重新创建(初始值为5
)并在函数结束时销毁。这就是为什么每次进入函数时它都会从5
开始递增。
答案 2 :(得分:0)
我认为您在可见性和持续时间之间感到困惑。
如果我们在本地声明static
变量,则其可见性将在其声明的块内,持续时间是程序的生命时间。
它控制持续时间,而不是可见性。 可见性已经确定,因为它在函数内部 - 在函数外部无法看到。
现在你的函数名static int static_var = 5;
中的第一个变量function
是该块的本地变量。对其他块没有影响(即到main
块)。
static int static_var = 5;
块中具有相同名称main
的第二个变量是本地的。对其他块(即function
主体块)没有影响。
总而言之,两者都是具有相同名称的自变量。他们之间没有关系。
使用static
关键字
static int var = 5; // Note: This is initialization not assignment.
然后这个变量在整个程序中只初始化一次并保留它的最后一个赋值。
当你使用非静态变量时
int var = 5; // every time created when function call and destroyed when function end.
// so it is not one time initialization, we can initialize it again.
// It will every time set value to 5 when you enter to function
静态变量的关键点:
如果我们在本地声明静态变量,那么它的可见性将在它声明的块内。
如果全局声明一个静态变量或函数,那么它的可见性只会是它在其他文件中声明的文件
答案 3 :(得分:0)
每次调用int var = 5;
时都会发生非静态function()
的初始化。
“如果为对象指定了初始化,则每次在执行块时达到声明或复合文字时都会执行初始化; ...”C11dr§6.2.4
static int static_var = 5;
的初始化发生一次;在main()
开始之前。
“具有静态存储持续时间的所有对象应在程序启动之前初始化(设置为其初始值)”C11dr§5.1.21
void function() {
int var = 5; // Assigned to 5 each function execution
static int static_var = 5; // Assigned to 5 once, on program start.
printf("\t[in function] var = %d\n", var);
printf("\t[in function] static_var = %d\n", static_var);
var++;
static_var++;
}
答案 4 :(得分:-2)
因此,您有三个变量 - 主要部分中的static int以及函数中的int和static int。关键是静态变量存在于声明范围内。每当运行程序达到范围时,通常的int都会创建(并初始化) 这就是为什么每次调用func时 - “通常”都是一样的,而静态变量“记住”它的值(它就像一个全局变量)。