“const int x = get();”在C中合法吗?我们可以在声明时将函数的返回值赋给常量吗?
这个论坛上一位备受赞誉的撰稿人"R.."
在2天后明确地告诉了我:
Initializers for objects of static storage duration must be constant expressions. The result of a function call is not a constant expression.
他在谈论全局变量。但是我不确定在main()
函数中声明的常量是什么,或者是那个问题的任何函数。直觉上我觉得即使对于在函数内声明的常量也是如此,以下程序源自以下链接,其所谓的correct
答案,让我感到困惑。
http://www.indiabix.com/c-programming/const/discussion-546
#include int get(); int main() { const int x = get(); printf("%d", x); return 0; } int get() { return 20; }
那么有人可以解释它是否在C中有效为一个常量赋值?
是的,它完全有效,因为你的变量是自动的,即不是 static
。
这些限制适用于static
变量,其值必须在编译时知道。
注意,C区分“常量表达式”和其他表达式,并且用于static
变量的初始化值必须是这样的常量表达式。 对于非static
变量,没有这样的要求。
是的,这个赋值是有效的C.但是x
不是一个常量表达式,它是一个const限定的变量,它不是同一个东西(至少在C中)。
C11(n1570),§6.6常量表达式
整数常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的
sizeof
表达式,_Alignof
表达式以及作为强制转换的直接操作数的浮动常量。
整数常量看起来像0L
或89.0
。 例如,在下面的代码片段中, 2
是整数常量,但x
不是。
const int x = 2;
我认为让你困惑的是你混淆了类型限定符 const
,以及存储类说明符 static
。 这些是完全不同的function,你无法相互比较。
const
表示变量在声明它的范围内是只读的,并且只能在初始化时赋予它一个值。 也就是说,在定义const
变量的同一行上。 它没有别的意思。
静态存储持续时间意味着变量将在整个程序执行期间存在。 声明为static
所有变量以及在文件范围(“globals”)声明的所有变量都具有静态存储持续时间。 如上所述,具有静态存储持续时间的变量只能使用常量表达式进行初始化,这不能与声明为const
只读变量混淆。
那么有人可以解释它是否在C中有效为一个常量赋值?
这取决于。
- 在文件范围声明的任何变量都有静态存储持续时间
- 必须使用常量表达式初始化具有静态存储持续时间的变量。
- 函数的返回值不是常量表达式。
- 因此,具有静态存储持续时间的变量无法使用函数的返回值进行初始化。
正如您所看到的,这与const
关键字无关,而是与声明变量的位置有关。 如果变量const
或不在本地范围内声明,那么用任何值初始化它都是完全正确的,如代码示例所示。