不能把const对象用在常量表达式中

不能把const对象用在常量表达式中

问:为什么不能把const对象用在常量表达式中呢?“constant”不就是常量吗?

答:在C语言中,const表示“只读”而不是“常量”。下面用几个例子说明为什么const对象不能用于常量表达式。

首先,const对象只在它的生命期内为常量,而不是在程序的整个执行期内。假设在函数体内声明了一个const对象:

void f(int n)
{
    const int m = n / 2;
    ...
}

当调用函数f时,m将会被初始化为n/2m的值在函数f返回之前都保持不变。当再次调用函数f时,m可能会得到不同的值。这就是出现问题的地方。假设m出现在switch语句中:

void f(int n)
{
    const int m = n / 2;
    ...
    switch (...) {
        ...
        case m: ...     /*** wrong ***/
        ...
    }
    ...
}

那么直到函数f调用之前m的值都是未知的,这违反了C语言的规则——分支标号的值必须是常量表达式。

接下来看看声明在块外部的const对象,这些对象具有外部链接,并且可以在文件之间进行共享。如果C语言允许在常量表达式中使用const对象,我们很容易遇到下列情况:

extern const int n;
int a[n];   /*** wrong ***/

n可能在其他文件中定义,这使编译器无法确定数组a的长度。(假设a是外部变量,所以它不可能是变长数组。)

如果这样还不能让你信服,考虑下面的情况:如果一个const对象也用volatile类型限定符声明,它的值可能 在程序执行过程中的任何时间发生改变。下面是C标准中的一个例子:

extern const volatile int real_time_clock;

程序可能不会改变变量real_time_clock的值(因为它声明为const),但是可以通过 其他某种机制修改它的值(因为它被声明为volatile)。

posted @ 2023-02-17 14:23  木凌云  阅读(74)  评论(0)    收藏  举报