为什么C不支持使用if-else语句初始化const变量?

时间:2017-08-06 15:10:28

标签: c const

我想使用 if-else 初始化const变量。
例如:

const int foo;
if (bar) {
    foo = 1;
} else {
    foo = 2;
}

在Java中,这是合法代码(使用final代替const)。原因是在所有可能的结果中,变量被分配一次并且从不重新分配。在C中,这不是合法代码。它不能成为C中的合法代码的原因是什么?

3 个答案:

答案 0 :(得分:16)

您可以通过三元运算符有条件地初始化Response.toString()变量:

foo

请注意,如果const int foo = bar ? 1 : 2;不是自动变量,那么初始化表达式必须在编译时进行评估,否则将无法编译。

答案 1 :(得分:6)

您可以使用三元运算符,但请记住,对于具有静态或线程局部存储类的对象,初始化表达式需要是编译时常量:

const int bar =  42;
#define BAR 42

#if 0
    const int foo = bar ? 1 : 2; /*ERROR -- bar is not an integer constant */
#else
    const int foo = BAR ? 1 : 2;
#endif

void fn(void)
{
    const int foo = bar ? 1 : 2;
#if 0
    static const int stc_foo = bar ? 1 : 2; /*ERROR*/
#else
    static const int stc_foo = BAR ? 1 : 2;
#endif
}

if-else语句不能用于初始化的原因是因为允许它需要对C语法进行一些相当广泛的更改,并且它可能使C语法和语义更加复杂。

基本上,编译器必须记住每个静态/线程,而不是简单地验证声明符后跟=initializer表达式,并且初始化表达式是一个常量,尚未初始化的局部变量,然后查找无条件执行的编译时可评估分支,并在其后面对其进行赋值并将其用于初始化。

此外,必须在文件范围中允许语句(在当前C语法的文件范围中不允许语句),并且验证constness和内存访问仅限于写入转换单元本地全局变量。或者,它们可以隐式转换为全局构造函数,但这会引入其他问题,例如编译单元之间的构造函数排序(如果构造函数生成是隐式的,则很难解决),需要在第一个构造函数中支持全局构造函数放置,或模糊静态变量赋值当前相当简单的性能特征。

答案 2 :(得分:3)

在C中, const 使变量只读

您只能在声明时初始化 const 变量,而不是之后,因为它变为只读。

这就是为什么您的代码在C中不合法,因为您更新了只读变量。

希望它会有所帮助!!