递增int和static int的意义:C

时间:2014-08-16 05:51:12

标签: c static increment

我以为我已经理解了如何正确地增加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

5 个答案:

答案 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

静态变量的关键点:

  1. 如果我们在本地声明静态变量,那么它的可见性将在它声明的块内。

  2. 如果全局声明一个静态变量或函数,那么它的可见性只会是它在其他文件中声明的文件

答案 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时 - “通常”都是一样的,而静态变量“记住”它的值(它就像一个全局变量)。