Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 静态变量忽略重新分配_C_Static_Assignment Operator - Fatal编程技术网

C 静态变量忽略重新分配

C 静态变量忽略重新分配,c,static,assignment-operator,C,Static,Assignment Operator,我怀疑这与作用域有关,但下面的代码用于生成带有初始空格和后续逗号的列表,如Peter van der Linden所述: void generate_initializer(char * string) { static char separator = ' '; printf("%c %s\n", separator, string); separator = ','; } 当separator经过指令static char separator=''时,为什么没有重新

我怀疑这与作用域有关,但下面的代码用于生成带有初始空格和后续逗号的列表,如Peter van der Linden所述:

void generate_initializer(char * string) {
    static char separator = ' ';
    printf("%c %s\n", separator, string);
    separator = ',';
}
separator
经过指令
static char separator=''时,为什么没有重新分配它?我知道“static”告诉编译器为扩展程序长度的
分隔符
分配空间,并使其作用域仅局限于
generate_initializer()
但是我假设代码不会忽略这样的赋值操作,并且总是将
分隔符重新赋值为空格。

static char separator = ' ';
仅在初始化
分隔符时执行一次


如果要重置其值,必须使用:

void generate_initializer(char * string) {
    static char separator = ' ';
    separator = ' ';
    printf("%c %s\n", separator, string);
    separator = ',';
}
为了


如果在函数范围内声明的变量是
静态的
,则该变量不是自动变量,而是全局分配的变量。因此,变量将在函数退出后存在,从而在函数调用期间保持其值,并且即使在函数退出后,对它的任何引用(指针)都是有效的。因此它只初始化一次。

静态
变量在编译时分配和初始化,而不是在运行时。为什么?我不知道,让我们从逻辑上把它分解一下。我们可以想象四种类型的局部变量:

  • 在运行时分配和初始化--即正常的局部变量
  • 在编译时分配和初始化--即静态变量
  • 在编译时分配,在运行时(重新)初始化——也就是说,这里的变量类型显然是您所期望的
  • 在运行时分配,在编译时初始化——即不可能
  • 好的,(4)是不可能的,(3)…(3)的重点是什么?我无法想象有什么意义。因此,它的实现方式是有意义的


    PS那个函数,虽然,是相当愚蠢的!只能在一个字符串上使用它。然后你就完成了。

    这并不是因为标准要求它不能。如果没有静电干扰,那就没什么用了!行
    静态字符分隔符=''可能重复不是赋值,而是声明。符号在声明中的含义与语句中的含义不同,
    =
    仅表示语句中的赋值。对了,忘了那个区别。编译时分配将是一种一次性精简的“运行时分配”,至少对于静态而言,它将在声明之外。如果要重置其值,则不应使用静态变量,因为枚举和其他列出的、被阻止的代码可以在列表的末尾加逗号(考虑到“自动生成”的代码),该书的作者提供了代码片段作为示例,说明不需要允许它。不管是哪种情况,这都是相当粗俗的!
    static char separator = ' '; // Static keyword extend the lifetime of a variable to the lifetime of the programme;