“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表达式以及作为强制转换的直接操作数的浮动常量。

整数常量看起来像0L89.0 。 例如,在下面的代码片段中, 2是整数常量,但x不是。

 const int x = 2; 

我认为让你困惑的是你混淆了类型限定符 const ,以及存储类说明符 static 。 这些是完全不同的function,你无法相互比较。

const表示变量在声明它的范围内是只读的,并且只能在初始化时赋予它一个值。 也就是说,在定义const变量的同一行上。 它没有别的意思。

静态存储持续时间意味着变量将在整个程序执行期间存在。 声明为static所有变量以及在文件范围(“globals”)声明的所有变量都具有静态存储持续时间。 如上所述,具有静态存储持续时间的变量只能使用常量表达式进行初始化,这不能与声明为const只读变量混淆。

那么有人可以解释它是否在C中有效为一个常量赋值?

这取决于。

  • 在文件范围声明的任何变量都有静态存储持续时间
  • 必须使用常量表达式初始化具有静态存储持续时间的变量。
  • 函数的返回值不是常量表达式。
  • 因此,具有静态存储持续时间的变量无法使用函数的返回值进行初始化。

正如您所看到的,这与const关键字无关,而是与声明变量的位置有关。 如果变量const或不在本地范围内声明,那么用任何值初始化它都是完全正确的,如代码示例所示。