首页 > 其他分享 >不能把const对象用在常量表达式中

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

时间:2023-02-17 14:33:16浏览次数:46  
标签:... const 常量 int 对象 表达式

不能把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)。

标签:...,const,常量,int,对象,表达式
From: https://www.cnblogs.com/matrioc/p/17130008.html

相关文章

  • 【tomcat启动报类找不到】java.lang.NoSuchMethodError org.springframework.util.Ref
    springboot项目打成war包,放tomcat里启动报错:java.lang.NoSuchMethodErrororg.springframework.util.ReflectionUtils.accessibleConstructor(Ljava/lang/Class;[Ljava/la......
  • 精通正则表达式 - 实例
    1.正整数正则表达式:/^(?!0)[0-9]+$/不以0开头functionisInteger(value){return/^(?!0)[0-9]+$/.test(value);}2.非0数正则表达式:/^\-?0\.[0-9]*[1-9]+[0-......
  • [转]正则表达式“\w”无法正常匹配中文
    原文地址:正则表达式“\w”无法正常匹配中文-YFEYI-博客园(cnblogs.com)使用webstorm的替换功能,使用正则,发现\w只能匹配英文,不支持中文,搜索到这篇博文,进行记......
  • Lambda 表达式中的 forEach 如何提前终止?
    情景展示如上图所示,我们想要终止for循环,使用return。执行结果如下:我们可以看到,只有赵六没被打印出来,后续的数组元素依旧被执行了。也就是说,关键字"return",在这里执......
  • Quartz定时任务Cron表达式详解
    Quartz定时任务Cron表达式详解cron表达式用于配置cronTrigger的实例。cron表达式实际上是由七个子表达式组成。这些表达式之间用空格分隔。1.Seconds(秒)2.Minutes(分)3.H......
  • Python Boa-constructor的使用
    上篇介绍了Python的环境搭建,主要是开发环境的介绍,本篇主要介绍Python的GUI开发工具Boa-constructor的使用和我们的程序开发完毕后的打包问题,本篇还会介绍在Python中我们如......
  • OpenMP Sections Construct 实现原理以及源码分析
    OpenMPSectionsConstruct实现原理以及源码分析前言在本篇文章当中主要给大家介绍OpenMP当中主要给大家介绍OpenMP当中sectionsconstruct的实现原理以及他调用......
  • Lamda表达式
              ......
  • jmeter正则表达式提取器
    正则表达式提取器:允许用户从服务器的响应中通过使用perl的正则表达式提取值。该元素会作用在指定范围取样器,用正则表达式提取所需值,生成模板字符串,并将结果存储到给定的......
  • java.security.NoSuchAlgorithmException: Error constructing implementation (algor
    服务器迁移,在新服务器上发现邮件发送或者使用httpClient会报出下面的异常,问题可谓是惊人的相似。javaMail发送邮件异常:  使用httpClient异常: 先开始排查问题。......