在C中,我们可以使用块来限制变量的作用域,因此也是如此

{
    int var = /* initialization */;

    while(...) {
        // some stuff with var
    }
}

相当于

while(...) {
    static int var = /* initialization */;
    // some stuff with var
}

推荐答案

不是的.

  • 关键字为static的初始值设定项必须为常量.

    {
       int var = f();
       for ( int j=0; j<2; ++j ) {
          printf( "%d\n", var++ );
       }
    }
    
    printf( "--\n" );
    
    for ( int j=0; j<2; ++j ) {
       static int var = f();
       printf( "%d\n", var++ );
    }
    
    <source>: In function 'main':
    <source>:18:24: error: initializer element is not constant
       18 |       static int var = f();
          |     
    
  • 带有static关键字的一个在程序的持续时间内存在,无论代码执行多少次,它都只会初始化一次.如果该代码块在一个被多次执行的循环中,或者在一个被多次调用的函数中,它就不会像期望的那样经常被初始化.

    for ( int i=0; i<2; ++i ) {
       int var = 3;
       for ( int j=0; j<2; ++j ) {
          printf( "%d\n", var++ );
       }
    }
    
    printf( "--\n" );
    
    for ( int i=0; i<2; ++i ) {
       for ( int j=0; j<2; ++j ) {
          static int var = 3;
          printf( "%d\n", var++ );
       }
    }
    
    3
    4
    3
    4
    --
    3
    4
    5
    6
    
  • 对于整个程序,只有一个关键字为static的变量实例,因此它由所有线程共享.

C++相关问答推荐

为什么这个select()会阻止?

Mise()在虚拟内存中做什么?

字符串令牌化xpath表达式

如何将字符串argv[]赋给C中的整型数组?

C语言编译阶段与翻译阶段的关系

字符是否必须转换为无符号字符,然后才能与getc家族的返回值进行比较?

在CLANG中调试预处理器宏

理解C版宏(看起来像未声明的变量?)

cairo 剪辑区域是否存在多个矩形?

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

搜索使用int代替time_t的用法

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

我错误地修复了一个错误,想了解原因

一元运算符

添加/删除链表中的第一个元素

Makefile - 将 .o 文件放入子文件夹中

malloc:损坏的顶部大小无法找出问题

在 C 中的 scanf() 格式说明符中使用宏获取字符串长度

OpenGL 中的非渐变 colored颜色 变化

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?