我怀疑这与范围有关,但是请使用此代码生成带有初始空格和后续逗号的列表,如Peter van der Linden的 Expert C Programming, Deep C Secrets 所示:
void generate_initializer(char * string) {
static char separator = ' ';
printf("%c %s\n", separator, string);
separator = ',';
}
为什么separator
在通过指令static char separator = ' ';
时未被重新分配?我理解'static'告诉编译器为separator
分配空间,扩展程序的长度,并使其范围仅限generate_initializer()
,但我认为代码不会忽略这样的赋值操作,并始终将separator
重新分配为空格。
答案 0 :(得分:1)
该行
static char separator = ' ';
只执行一次 - 初始化separator
时。
如果要重置其值,则必须使用:
void generate_initializer(char * string) {
static char separator = ' ';
separator = ' ';
printf("%c %s\n", separator, string);
separator = ',';
}
答案 1 :(得分:1)
static
变量在编译时分配和初始化,而不是在运行时。为什么?我不知道,让我们在逻辑上分解它。我们可以想象四种类型的局部变量:
好的,(4)是不可能的,(3)......(3)的重点是什么?我无法想象任何一点。因此,它的实施方式是有道理的。
PS那个功能虽然很傻!您只能在一个字符串上使用它。然后你就完成了。
答案 2 :(得分:0)
对于
static char separator = ' '; // Static keyword extend the lifetime of a variable to the lifetime of the programme;
如果在函数作用域内声明的变量是static
,那么它使它不是自动变量而是全局分配的变量。因此,变量将在函数退出后存在,因此将在函数的调用中保持其值,并且即使在函数退出之后,对它的任何引用(指针)也是有效的。所以它只初始化了一次。