【问题标题】:Cannot understand the behaviour of static variable无法理解静态变量的行为
【发布时间】:2012-08-24 17:52:03
【问题描述】:
#include <stdio.h>

main()
{

    int i = 10;
    static int a = i;
    if(a==10)
        printf("yes 1st comparision is equal\n");
    else
        printf("no 1st comparision is not equal\n");
    if(i==10)
        printf("yes 2nd comparision is equal\n");
    else
        printf("no 2nd comparision is not equal\n");

    a=15;
    if(a==i)                                              
        printf("yes 3rd comparision is equal\n");
    else
        printf("no 3rd comparision is not equal\n");

}

为什么a重新初始化为15,输出为no 3rd comparision is not equal 而输出应该是yes 3rd comparision is equal?

【问题讨论】:

  • a 是 15,i 是 10 -- 它们不相等...static 变量不是引用。
  • C 不是一种面向对象的语言,因此没有将值类型作为对象的内在概念。 C 中的 int 实际上只是一个(通常是四个)字节序列,仅此而已。
  • @veer 我想知道的是为什么“a”被​​重新初始化为 15
  • 因为您为其分配了值 15:a=15;
  • 您必须将其编译为 C++,而不是 C。在 C 中,static int a = i; 行是一个错误;静态对象的初始化器必须是编译时常量。

标签: c variables pointers static


【解决方案1】:

您要比较的是两个不同的值。

从您的问题来看,您似乎期望的是引用(通常使用指针来实现)。

这个例子与静态无关,因为函数main只输入一次。

如果参考是你所追求的,这是一个非常简单的用法:

#include <stdio.h>

int main() {
    int i = 10;
    int* const a = &i;
    if (*a == 10)
        printf("yes 1st comparision is equal\n");
    else
        printf("no 1st comparision is not equal\n");
    if (i == 10)
        printf("yes 2nd comparision is equal\n");
    else
        printf("no 2nd comparision is not equal\n");

    *a = 15;

    if (*a == i)
        printf("yes 3rd comparision is equal\n");
    else
        printf("no 3rd comparision is not equal\n");

    return 0;
}

【讨论】:

  • 我的意思是,考虑一下这个例子。无效计数(无效){静态整数计数1 = 0;整数计数2 = 0;计数1++;计数2++; printf("\ncount1 的值为 %d,count2 的值为 %d", count1, count2); } int main(){ 计数();数数();数数();返回0;这里变量count1的值只被初始化一次,因为它是一个静态变量,但是为什么在前面的例子中“a”被初始化为15。
  • @minefield,我不认为static 像你想象的那样工作。
  • @minefield 在前面的例子中,它被初始化为i (10)。 a 是一个值,与 i 分开,您稍后将该值设置为 15。希望对您有所帮助。
【解决方案2】:

您的问题“为什么“a”被​​初始化为 15”的答案是您将值分配给“a”。当您将其声明为

时,它已初始化为 10

静态 int a = i;

其中 i=10。 当你这样做时

a=15;

“a”的值发生变化。您没有再次声明“a”。 您也没有更改“i”的值。因此,比较失败。 如果您不想更改“a”的值,请将其声明为“const”变量。

希望这能回答您的问题。 阿迪亚

【讨论】:

    【解决方案3】:

    在下面的示例中,static int count1 = 0; 是初始化(在声明时赋值)。而count1++; 等价于count1 = count1 + 1;,这是赋值而不是初始化。

    当第一次调用count函数时,static int count1 = 0;会被执行并赋值为0,同时count1++也会将1赋值给staitc变量count1。第二次调用count函数时,static int count1 = 0;不会被执行,count1++会被执行,2会被分配给count1。

    void count(void) 
    { 
        static int count1 = 0; 
        int count2 = 0; 
        count1++; 
        count2++; 
        printf("\nValue of count1 is %d, Value of count2 is %d", count1, count2); 
    } 
    

    初始化意味着在变量声明期间(在初始阶段)为变量赋值。声明后赋值只是赋值而不是初始化。

    对于静态变量,初始化只会进行一次,但赋值可以进行任意次数。

    现在在您的第一个程序中,您正在执行a=15;,您认为= 操作在第二次是不可能的,而++ 操作对于静态变量是可能的。

    在你的程序中a=15; 也可以写成下面的++ 操作。

    for(j = 0; j = 15; j++)
    {
        a++;
    }
    

    所以赋值 (=) 操作在静态变量上也是有效的,即使在第二次也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-10
      • 2023-03-22
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多