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;
    }
  • 相关阅读:
    LeetCode Path Sum II
    LeetCode Longest Palindromic Substring
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Binary Tree Maximum Path Sum
    LeetCode Find Peak Element
    LeetCode Maximum Product Subarray
    LeetCode Intersection of Two Linked Lists
    一天一个设计模式(1)——工厂模式
    PHP迭代器 Iterator
  • 原文地址:https://www.cnblogs.com/a3192048/p/12241323.html
Copyright © 2011-2022 走看看