zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    sql 从A表复制数据到B表
    sql union和union all
    sql 类型转换
    SQL聚合函数
    数据存储类型
    asp.net中XML如何做增删改查操作(基础操作)
    数据库分页总结
    javascript 和 jquery 初学总结
    File FileStream StreamReader和StreamWriter
    oracle建数据库
  • 原文地址:https://www.cnblogs.com/a3192048/p/12241323.html
Copyright © 2011-2022 走看看