8

该论坛上一位享有盛誉的撰稿人"R.."在两天前明确告诉我:

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<stdio.h>
int get();

int main()
{
    const int x = get();
    printf("%d", x);
    return 0;
}

int get()
{
    return 20;
}

那么任何人都可以解释在 C 中将返回值分配给常量是否有效?

4

3 回答 3

9

是的,这是完全有效的,因为您的变量是自动的,即不是 static.

这些限制适用于static变量,其值必须在编译时已知。

请注意,C 区分“常量表达式”和其他表达式,并且用于static变量的初始值设定项必须是这样的常量表达式。对于非static变量,没有这样的要求。

于 2013-04-26T11:16:02.597 回答
3

是的,这个赋值是有效的 C。但x它不是一个常量表达式,它是一个 const 限定的变量,这不是一回事(至少在 C 中)。

C11 (n1570), § 6.6 常量表达式

整数常量表达式应具有整数类型,并且应仅具有整数常量、枚举常量、字符常量、sizeof 结果为整数常量的_Alignof表达式、表达式和作为强制类型转换的直接操作数的浮点常量的操作数。

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

const int x = 2;
于 2013-04-26T11:16:10.983 回答
1

我认为让您感到困惑的是您将类型限定符 const存储类说明符 static混为一谈。这些是完全不同的功能,您无法将它们相互比较。

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

静态存储持续时间意味着变量将在程序的整个执行过程中存在。所有声明为的static变量和所有在文件范围内声明的变量(“全局变量”)都具有静态存储持续时间。如前所述,具有静态存储持续时间的变量只能使用常量表达式初始化,不要与声明为的只读变量混淆const

那么任何人都可以解释在 C 中将返回值分配给常量是否有效?

这取决于。

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

const如您所见,这与关键字无关,而是与声明变量的位置有关。无论是否在本地范围内声明了变量,const都可以使用任何值对其进行初始化,如您的代码示例所示。

于 2013-04-26T13:53:01.287 回答