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

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

一个变量可以用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. VIM - 问题: 简单变换

    1. 概述 学习 Java 反射的时候, 碰到的简单问题 手动可以处理, 但是真的很浪费时间 想熟悉一下工具的使用 2. 题目 源 Modifier.isAbstract(int modifiers) ...

  2. C语言特点有哪些?

    C语言的特点 : 1.简洁紧凑.灵活方便 C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示.它把高级语言的基本结构和语句与低级语言的实用性结合起来. C 语言可以象汇编语言一 ...

  3. NET com组件注册

    1.签名 右击项目->属性->[签名]标签, 选中[为程序集签名]–>[选择强名称密钥文件]–>[新建],输入你的密钥名称,去掉[使用密码保护密钥文件] 最重要的签名,并且注册 ...

  4. redis持久化2

    编程迷思 博客园 首页 联系 订阅 管理 随笔 - 11  文章 - 0  评论 - 318 深入学习Redis(2):持久化 前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次 ...

  5. UVa 400 Unix Is命令

    简单题 #include <bits/stdc++.h> using namespace std; const int maxn=110; string s[maxn]; int main ...

  6. JAVA基础学习(1)之计算

    1.0计算机与编程语言 1.0.1计算机与编程语言 计算机解决问题 人:What to do 计算机:How to do 编程语言 描述要求计算机如何做事情的过程或方法 算法 计算=算法—>编程 ...

  7. Python中的bool类型

    Python 布尔类型 bool python 中布尔值使用常量True 和 False来表示:注意大小写 比较运算符< > == 等返回的类型就是bool类型:布尔类型通常在 if 和 ...

  8. Codeforces Round #622 (Div. 2) A. Fast Food Restaurant

    Tired of boring office work, Denis decided to open a fast food restaurant. On the first day he made ...

  9. excel 练习玩具统计项目组excel日报

    import xlrd import xlwt import os,time import json from xlrd import xldate_as_tuple from datetime im ...

  10. 《创业者技能树》--创业课--14天复盘第一课candy2--HHR计划

    1,厉害的人是如何分析问题的?