下面是一个例子:
#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
吗?
1条答案
按热度按时间ymdaylpp1#
在第二个例子中,通过调用函数,我们不是重新声明了它吗?
不,我们不是:我们正在不同的作用域中声明
i
;特别是在不同函数的主体中。在一个给定的作用域中你只能定义一个变量一次(忽略子作用域);但可以在不同的作用域中定义同名变量:并且与命令“最接近”的定义是将相关的定义;它将"shadow"相同名称的其他变量,否则这些变量可能在该作用域中可用。
当然,用相同的名字定义许多变量并不是一个好主意,因为它们可能会互相遮蔽--这会让人感到困惑,而且它们的名字也可能没有意义。人们通常使用一个单字母的变量作为循环计数器:
i
、j
、k
等-但是,对于更持久的内容,您往往会避免使用i
。1 2 3 4 5
......为什么会出现这种情况?因为在
increment()
函数中,counter
是一个static unsigned int
,这意味着它有static storage duration-它只初始化一次,并且在调用函数之间保持它的值。