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

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

一个变量可以用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. 【音乐欣赏】《99》 - MOB CHOIR

    曲名:99 作者:MOB CHOIR [00:00.000] 作曲 : 佐々木淳一 [00:00.150] 作词 : 佐々木淳一 [00:00.450] [00:02.370]If everyone ...

  2. 占位符 css

    == 普通的英文半角空格   ==   ==   == no-break space (普通的英文半角空格但不换行)   == 中文全角空格 (一个中文宽度)   ==   == en空格 (半个中文 ...

  3. 【Hibernate 多表查询】

    HibernateManyTable public class HibernateManyTable { //演示hql左连接查询 @Test public void testSelect12() { ...

  4. 使用ssh 初始化git一个空java工程

    1:进入git 目录 cd /home/git/repo/ 2:创建一个java工程名 mkdir qft-payment 3:进入工程 cd  qft-payment/ 4:初始化空工程 git - ...

  5. HDU 2063 过山车(二分图 && 匈牙利 && 最小点覆盖)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 这是一道很经典的匈牙利问题: 把男同学看成左边点,女同学看成右边点,如果两个同学愿意同 ...

  6. C语言:根据以下公式计算s,s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+...+n) -在形参s所指字符串中寻找与参数c相同的字符,并在其后插入一个与之相同的字符,

    //根据一下公式计算s,并将计算结果作为函数返回值,n通过形参传入.s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+...+n) #include <stdio.h> ...

  7. arc066E - Addition and Subtraction Hard

    题目链接 题目大意 给定一个只含加减和数字的表达式,在其中添加括号,使其值最大. 解题思路 显然,只有减号后面的括号会使其中表达式的值取反. 然后只有已经有左括号时才能加入右括号. 所以用\(f_0\ ...

  8. Django框架之ORM对表结构操作

    ORM的优点:(1)简单,不用自己写SQL语句 (2)开发效率高 ORM的缺点:对于不同的人写的代码,执行效率有差别 ORM的对应关系: 类  ---------->  数据表 对象------ ...

  9. .NET中的字符串(1):字符串 - 特殊的引用类型

    C# string 特殊的引用类型 .Net 框架程序设计(修订版)中有这样一段描述:String类型直接继承自Object,这使得它成为一个引用类型,也就是说线程上的堆栈上不会驻留有任何字符串.(译 ...

  10. 使用 vant 的 v-lazy 实现图片 vue 在移动端的懒加载

    官方文档:https://youzan.github.io/vant/#/zh-CN/lazyload 引入 Lazyload 是 Vue 指令,使用前需要对指令进行注册 import Vue fro ...