常量表达式是指值不会改变且在编译过程中就能够得到计算结果的表达式,能在编译时求值的表达式。

程序先编译再运行:  在编译阶段, 编译器将在编译过程中把用到该常量的地方都全都替换为 常量的值。 但是常量不是常量表达式, 只有用常量表达式初始化的常量 才是成为常量表达式,用非常量表达式初始化的常量仅仅是常量。。如果常量的初始值不是常量表达式,则该常量不是常量表达式。

一个变量可以用constexpr类型说明符声明成 constexpr类型,  则变量是一个常量, 且声明为constexpr的变量必须用常量表达式初始化, 所以该变量也是一个常量表达式。

例1:

#include <iostream>
    using namespace std;
     
    int main()
    {
        
        const int a1 = 10;             // a1是常量表达式。  字面值类型包括: 算术类型、引用、指针。  字面值是常量表达式。 用常量表达式初始化的常量也是 常量表达式。
     
        const int a2 = a1 + 20;      // a2是常量表达式, a1+20在编译阶段就能确定值,且不变, 所以是常量表达式。
     
        int a3 = 5;                    // a3不是常量表达式。  该语句只有在程序运行时才会创建对象, 在编译时不会确定值,且可改变。
     
        const int a4 = a3;           // a4是常量 ,不是常量表达式,因为a3程序的执行到达其所在的声明处时才初始化,所以变量a4的值程序运行时才知道。但编译没问题!
     
        return 0;
    }

以上代码可正常编译。

说明了const声明的不一定就是常量表达式!

C++11新标准规定,允许将变量声明为constexpr 类型以便由编译器来验证变量的值是否是常量表达式。constexpr 指定符声明可以在编译时求得函数或变量的值,声明为constexpr的变量一定是一个常量,而且必须用常量表达式来进行初始化。

例2:

#include <iostream>
    using namespace std;
     
    int main()
    {
        
        const int a1 = 10;             // a1是常量表达式。
     
        const int a2 = a1 + 20;      // a2是常量表达式
     
        int a3 = 5;                    // a3不是常量表达式
     
        constexpr int a4 = a3;          //报错 constexpr声明的变量是常量,必须用常量表达式初始化,因为a3程序运行到其所在的声明处时才创建,所以变量a4的值程序运行时才知道。编译报错!
     
        return 0;
    }

constexpr int a4 = a3;  编译将报错!   声明为constexpr的变量 必须用 常量表达式初始化,  而a3不是常量表达式, 所以出错。

例3:

一维数组的定义:   类型说明符    数组名 [ 常量表达式]

#include <iostream>
    using namespace std;
     
    int main()
    {
        
        const int a1 = 10;             // a1是常量表达式。
        const int a2 = a1 + 20;      // a2是常量表达式
        int a3 = 5;                    // a3不是常量表达式
        const int a4 = a3;           // a4不是常量表达式,因为a3程序的执行到达其所在的声明处时才初始化,所以变量a4的值程序运行时才知道。编译报错!
     
        char arr1[a2];   // 没问题
        char arr2['y'];  // 没问题,'y'的ASCII码为121,相当于 char arr2[121];
     
        char arr3[a4];   // 编译报错,因为a4不是常量表达式
     
     
        return 0;
    }
————————————————
版权声明:本文为CSDN博主「啊大1号」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a3192048/article/details/81430421

C++常量表达式、const、constexpr(C++11新增)的区别的更多相关文章

  1. 常量表达式和constexpr(c++11)

    常量表达式 常量表达式是指值不会改变且在编译阶段就能得到计算结果的表达式(两点要求) ; //是常量表达式 ; //是常量表达式 "; const int siz=s.size(); //不 ...

  2. const限定符、constexpr和常量表达式------c++ primer

    编译器将在编译过程中把用到const变量的地方都替换成对应的值,为了执行这种替换,编译器必须知道变量的初始值.如果程序包含多个文件,则那个用了const对象的文件都必须能访问到它的初始值才行.要做到这 ...

  3. c++nullptr(空指针常量)、constexpr(常量表达式)

    总述     又来更新了,今天带来的是nullptr空指针常量.constexpr(常量表达式)C++的两个用法.Result result_fun = nullptr;constexpr stati ...

  4. constexpr和常量表达式

    常量表达式:值不会改变并且在编译过程就能得到计算结果的表达式. 字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式. 一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同 ...

  5. 第8课 常量表达式(constexpr)

    一. const 和constexpr的区别 (一)修饰变量时,const为“运行期常量”,即运行期数据是只读的.而constexpr为“编译期”常量,这是const无法保证的.两者都是对象和函数接口 ...

  6. 10、初识constexpr和常量表达式

    常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式.显然字面值属于常量表达式,用于表达式初始化的const对象也是常量表达式. 1.判断一个变量是不是常量表达式 一个对象(表达式)是不是 ...

  7. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

  8. C++11 constexpr常量表达式

    常量表达式函数 要求: 函数体内只有单一的return返回语句 例如: constexpr int data() { const int i=1; //含有除了return以外的语句 return i ...

  9. constexpr与常量表达式(c++11标准)

    关键字 constexpr 是C++11中引入的关键字,是指值不会改变并且在编译过程中就得到计算结果的表达式.(运行中得到结果的不能成为常量表达式,比如变量). 声明为constexpr的变量一定是一 ...

随机推荐

  1. Spring - 周边设施 - H2 数据库启动时写入数据

    1. 概述 之前讲到了 H2 的引入 这下我想说说 H2 启动时的 数据导入 2. 场景 需求 启动项目后, H2 启动起来 环境数据会自动注入 H2 数据库 可以验证是否成功 3. 环境 os wi ...

  2. Error: Cannot find module 'webpack' 问题解决办法

    这句话的意思是:没有找到webpack模块. 就算之前你装了webpack,那肯定是非全局安装 所以要全局安装 npm install --save-dev webpack 问题解决

  3. Laravel 解决在ajax 请求下不能保存session的问题

    Laravel 解决在ajax 请求下不能保存session的问题 \Session::put('isLogin',true); // 你要保存的session key \Session::put(' ...

  4. Java编写POST请求

    package com.mytesting; import java.io.DataOutputStream; import java.io.InputStream; import java.net. ...

  5. 2020牛客寒假算法基础集训营3 - G. 牛牛的Link Power II(线段树)

    题目链接:牛牛的Link Power II 题意:给你一个只含$0$和$1$的串,定义串的$Link$值为串中两个的$1$之间的距离的和,$(u,v)$和$(v,u)$被看认为是同一对,有$m$次操作 ...

  6. EF中 GroupJoin 与 Join

    数据: GroupJoin: 返回左表所有数据 using (tempdbEntities context = new tempdbEntities()) { var query = context. ...

  7. C语言:找出一个大于给定整数m且紧随m的素数,-求出能整除x且不是偶数的数的个数,

    //函数fun功能:找出一个大于给定整数m且紧随m的素数,并作为函数值返回. #include <stdlib.h> #include <conio.h> #include & ...

  8. 第八届极客大挑战 Web-故道白云&Clound的错误

    web-故道白云 题目: 解题思路: 0x01 首先看到题目说html里有秘密,就看了下源代码如图, 重点在红圈那里,表示输入的变量是id,当然上一行的method=“get”同时说明是get方式获取 ...

  9. 【Go语言系列】第三方框架和库——GIN:快速入门

    要求要安装Gin软件包,需要:1.安装Go(需要1.11+版本)2.设置Go工作区 安装1.下载并安装 gin: $ go get -u github.com/gin-gonic/gin 2.将 gi ...

  10. pillow 初级用法

    # 转载至:https://www.cnblogs.com/apexchu/p/4231041.html Image类 Pillow中最重要的类就是Image,该类存在于同名的模块中.可以通过以下几种 ...