• C++常量表达式、const、constexpr(C++11新增)的区别


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

    例1:

    #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的值程序运行时才知道。但编译没问题!
    
    	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;           // a4不是常量表达式,因为a3程序的执行到达其所在的声明处时才初始化,所以变量a4的值程序运行时才知道。编译报错!
    
    	return 0;
    }
    

    constexpr int a4 = 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;
    }
  • 相关阅读:
    C#冒泡排序--详解
    盘古搜索--实例解析
    ajax提交表单序列化(serialize())数据
    随机数大揭秘
    静态代码块(主要是注意执行顺序)
    单例模式
    递归
    vue路由嵌套(邹文丰)
    vue computed和 methods、 watch 区别(邹文丰)
    vuex状态管理mutations,getters,actions总结(邹文丰)
  • 原文地址:https://www.cnblogs.com/a3192048/p/12241323.html
Copyright © 2020-2023  润新知