2016-07-16 80 views
-3

在C++中,解析表達式是在編譯時執行還是可以在運行時執行? 我按我的例子想着這些情況如下在C++中解析表達式

編譯時間

x = 2 + 3; 

運行時間

x = a + b; 

注:值和b是從控制檯在運行時服用。

回答

0

如果要添加的變量的值是在編譯時不固定(例如const int a = 5;),則表達式不能在編譯時進行評價。在這種情況下,因爲值來自命令行,所以必須在編譯時評估表達式。

+0

這是有點誤導,因爲如果我們寫'const x = a + b; const y = x + 1;',儘管x和y是常量,實際上不會有任何編譯時評估。 'const'只意味着我們承諾不改變它;這並不意味着它在編譯時必然是可計算的。 –

+0

在C++ 98中,我同意你的看法。在C++ 11中,'constexpr'改變了風景。在C++ 14中,'constexpr'使編譯時幾乎所有非ODR使用的東西都可用。 – Tim

1

這取決於編譯器。許多現代編譯器執行不斷的摺疊 - 也就是說,編譯時已經解決了諸如2 + 3等表達式。然而,每個編譯器對應用常量摺疊的程度各不相同;它可能真的很聰明,或者根本沒有。

請注意,定義爲constexpr的表達式總是在編譯時計算的。 constexpr表達式具有某些限制,可以確保編譯器可以完全評估表達式。目前,這些限制在標準的每次更新中似乎都被推回。