我想使用 if-else 初始化const
变量。
例如:
const int foo;
if (bar) {
foo = 1;
} else {
foo = 2;
}
在Java中,这是合法代码(使用final
代替const
)。原因是在所有可能的结果中,变量被分配一次并且从不重新分配。在C中,这不是合法代码。它不能成为C中的合法代码的原因是什么?
答案 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中不合法,因为您更新了只读变量。
希望它会有所帮助!!