【问题标题】:Static variable ignores reassignment静态变量忽略重新分配
【发布时间】:2014-07-28 05:51:57
【问题描述】:

我怀疑这与范围有关,但请使用此代码生成带有初始空格和后续逗号的列表,取自 Peter van der Linden 的 Expert C Programming, Deep C Secrets: p>

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

为什么separator 在通过指令static char separator = ' '; 时没有被重新分配?我知道“静态”是告诉编译器为 separator 分配空间,以扩展程序的长度,并将其范围仅设置为 generate_initializer(),但我认为代码不会忽略赋值操作像这样并且总是将separator重新分配为空白。

【问题讨论】:

  • 并不是因为标准要求它不能。没有那个静态就不会那么有用了!
  • static char separator = ' '; 行不是赋值,而是声明。符号在声明中的含义与语句不同,= 仅表示语句中的赋值。
  • 对,忘了那个区别。编译时分配将是一次性的精简且“运行时分配”在声明之外,这是完全有道理的,至少对于静态而言。

标签: c static assignment-operator


【解决方案1】:

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

  1. 在运行时分配和初始化——即普通的局部变量
  2. 在编译时分配和初始化——即静态变量
  3. 在编译时分配并在运行时(重新)初始化 - 即您显然期望的那种变量
  4. 在运行时分配并在编译时初始化——也就是说,不可能

好的,(4)是不可能的,(3)......(3)有什么意义?我想不出任何意义。因此,它的实现方式是有意义的。

PS 不过,这个功能非常愚蠢!您只能在一个字符串上使用它。然后你就完成了。

【讨论】:

  • 由于枚举和其他列出,阻塞代码可以在列表末尾有一个逗号(考虑到“自动生成”代码),本书作者提供代码sn-p为一个没有必要允许它的例子。在任何一种情况下,它都是相当骇人听闻的!
【解决方案2】:

线

static char separator = ' ';

只执行一次 -- 当 separator 被初始化时。

如果你想重置它的值,你必须使用:

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

【讨论】:

  • 如果你想重置它的值,你不应该使用静态变量
【解决方案3】:

对于

static char separator = ' '; // Static keyword extend the lifetime of a variable to the lifetime of the programme; 

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 2021-08-07
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多