C语言 为什么两个示例中的静态存储行为不同?

olhwl3o2  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(110)

下面是一个例子:

#include <stdio.h>

int main(void) {
    static int i=0;
    printf("%d",i);
    static int i=0;
    printf("%d",i);
    return 0;
}

这会给我一个错误:
error: redefinition of 'i'
下面是另一个示例:

#include <stdio.h>
void increment(void) {
    static unsigned int counter = 0;
    counter++;
    printf("%d ", counter);
}

int main(void) {
    for (int i = 0; i < 5; i++) {
        increment();
    }
    return 0;
}

输出如下:
1 2 3 4 5
"为什么会这样“
在第二个例子中,通过调用函数,我们不是重新声明了它吗?输出不是应该是1 1 1 1 1吗?

ymdaylpp

ymdaylpp1#

在第二个例子中,通过调用函数,我们不是重新声明了它吗?
不,我们不是:我们正在不同的作用域中声明i;特别是在不同函数的主体中。在一个给定的作用域中你只能定义一个变量一次(忽略子作用域);但可以在不同的作用域中定义同名变量:

int i; // global scope

void foo()
{
    int i; // scope - body of foo
    {
        int i; // a sub-scope of the body of foo
    }
}

int main()
{
    int i; // a different scope - body of main, not body of foo
}

并且与命令“最接近”的定义是将相关的定义;它将"shadow"相同名称的其他变量,否则这些变量可能在该作用域中可用。
当然,用相同的名字定义许多变量并不是一个好主意,因为它们可能会互相遮蔽--这会让人感到困惑,而且它们的名字也可能没有意义。人们通常使用一个单字母的变量作为循环计数器:ijk等-但是,对于更持久的内容,您往往会避免使用i
1 2 3 4 5......为什么会出现这种情况?
因为在increment()函数中,counter是一个static unsigned int,这意味着它有static storage duration-它只初始化一次,并且在调用函数之间保持它的值。

相关问题