为什么const变量不需要在C中初始化?

Des*_*tor 10 c initialization const

const必须初始化C++中的变量意味着uninitialized const variable不可能并且它是编译器错误.但为什么C语言也不一样呢?考虑以下编译精细C的程序:

#include <stdio.h>
int main()
{
    const int a;
}
Run Code Online (Sandbox Code Playgroud)

允许的原因是uninitialized const什么?如果C也遵循与C++相同的规则,那会不会很好?是否由于性能问题,每次调用函数并初始化需要时间时,需要初始化本地const变量?

AnT*_*AnT 7

差异可能源于,除其他外,C 语言中的初始化方法通常更加宽松,而不仅仅是在const对象方面。例如,这段代码在 C++ 中是非法的

goto over;
int a = 5;
over:;
Run Code Online (Sandbox Code Playgroud)

因为它跳入了a绕过其初始化的范围。同时在 C 中,这段代码是完全合法的,变量aover:.

同样的逻辑适用于您的const int a声明。C 语言只是认为未初始化的对象没什么大不了的,即使在以后不再可能将其设置为确定值的情况下也是如此。

C++ 中更严格的初始化要求的主要原因是在语言中引入了非平凡的初始化(构造函数),即不能有意义地绕过的初始化。标量对象及其在 C++ 中的初始化只是标记为更广泛概念的一小部分。

如果 C 也遵循与 C++ 相同的规则,那不是很好吗?

我没看到。C 和 C++ 是完全不同的语言。而且他们的对待方式也const大不相同。


chu*_*ica 5

为什么C中const变量不需要初始化?

历史。

const从一开始就在 C++ 中指定,并且使用满足了该语言的目标。 const后来在 C 中指定了相关但不同的含义,以尽量减少现有的 C 代码兼容性问题。

由于 C 开始时没有const,所以后来包含它更像是read-only修饰符而不是修饰符constant。这使得现有编译器本质上将写入未定义行为const视为无任何内容。const较新的编译器/代码可以利用它提供的优势const

const int a;
a = 5;  // problem in C as code attempts to write `a`

// Really should be `const char *fred`, but allowed for backwards compatibility.
char *fred = "sally";  
Run Code Online (Sandbox Code Playgroud)

C++ 采用了更强大的方法并要求初始化。

另请参见C 中的 const 与 C++ 中的 const