常數表達式是指值不會改變且在編譯過程中就能夠得到計算結果的表達式,能在編譯時求值的表達式。
範例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++常數表達式、const、constexpr(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!