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

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

一个变量可以用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. 【REST详述及RESTful规范】

    目录 Web服务交互 理解REST 什么是资源? 什么是URI.URL? 统一资源接口 资源的表述 状态转移 小结 "RESTful是一种软件的架构风格.设计风格,为客户端和服务端的交互提供 ...

  2. HashSet HashMap 源码阅读笔记

    hashcode() 与 equals() 应一起重写,在HashMap 会先调用hash(key.hashcode()) 找到对应的entry数组位置 (一般初始是16,2^x,rehash后会翻倍 ...

  3. Java Web实现使用浏览器从服务器下载文件(后台)

    Java Web实现 使用浏览器从服务器下载文件. 下面实现两种情况的下载,需求如下: 需求(一):1.用户在页面填写表单. 2.填写完成后,选择下载,将表单内容发往后台. 3.后台根据内容生产一个文 ...

  4. mvc 部分页

    在一些复杂的项目中,我们经常会遇到一个页面存在很多模块,存在页面交互或者加载数据过多等问题,这种时候,我们很可能会考虑到通过使用部分页来解决这个问题(ps:当然还有很多的解决方案,在这里只是简单介绍这 ...

  5. Gitlab+Jenkins用钩子实现git提交后jenkins自动化构建

    Gitlab+Jenkins用钩子实现git提交后jenkins自动化构建 一.Jenkins 进入项目---->Configure 1.设置项目代码从git中拉取 2.设置钩子程序 二.git ...

  6. ping命令基于ICMP协议的返回信息分析

    Ping是潜水艇人员的专用术语,表示回应的声纳脉冲,在网络中 Ping 是一个十分好用的 TCP/IP 工具.它主要的功能是用来检测网络的连通情况和分析网络速度.可以利用 PING 命令检查网络连通状 ...

  7. BFS和DFS详解以及java实现(转载)

    作者:Leo-Yang 原文都先发布在作者个人博客:http://www.leoyang.net/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...

  8. SpringBoot-自动装载

    1,SpringBoot里面有内置的tomcat容器. 2,SpringBoot是基于已有的东西创建的新的东西.核心:(AutoConfiguration)自动装载,Starter,Actuator, ...

  9. ES-moreLikeThisQueryBuilder-文章推荐

    //获取推荐文章 public Object getRecommendList2(String name) { NativeSearchQueryBuilder queryBuilder = new ...

  10. IDEA Tomcat配置 VM Option

    -server -XX:PermSize=512M -XX:MaxPermSize=1024m -Dfile.encoding=UTF-8