![](/img/trans.png)
[英]Why are floating point types and integer types are treated differently in C++
[英]Why isn't "0f" treated as a floating point literal in C++?
為什么0f
在 C++ 中不被視為浮點文字?
#include <iostream>
using namespace std;
int main(){
cout << 0f << endl;
return 0;
}
編譯以上給了我
C2509(語法錯誤:'數字后綴錯誤')
使用 VS2008。
如果此設計決策有明確說明的原因,則應在 C99“基本原理”文檔中(C++ 逐字從 C 復制了所有這些內容,而無需重新考慮)。 但沒有。 這是關於“f”后綴的全部內容:
§6.4.4.2 浮動常量
與現有實踐一致,浮點常量定義為
double
類型。 由於 C89 允許僅包含float
操作數的表達式在float
算術中執行而不是double
,因此需要一種表達顯式float
常量的方法。long double
類型提出了類似的問題。添加了
F
和L
后綴來傳達帶有浮點常量的類型信息,就像L
后綴用於長整數一樣。 為了與先前的實踐兼容,浮動常量的默認類型仍然是 double。 小寫的f
和l
也允許作為后綴。
有一個隱含的原因,雖然。 請注意措辭:“已添加...后綴以傳達具有浮動常量的類型信息。” 該標准的作者認為數字常量在您到達后綴時已經明確為整數或浮點數。 后綴僅用於類別內的額外特異性,它不能將數字從一個類別翻轉到另一個類別。 這得到了實際語法(C99 §6.4.4)的支持,它首先將數字常量定義為整數常量或浮點常量,然后為每個定義單獨的后綴類。
假設 C++ 用於浮點常量的語法與 C 相同(我認為這是真的),我們有:
一些取自ANSI C grammar
快捷方式的定義
D [0-9]
L [a-zA-Z_]
H [a-fA-F0-9]
E [Ee][+-]?{D}+
FS (f|F|l|L)
IS (u|U|l|L)*
現在,您在浮點末尾看到的f
或F
已在上面的FS
中定義。
現在讓我們看看識別有效浮點常量的語法:
{D}+{E}{FS}?
{D}*"."{D}+({E})?{FS}?
{D}+"."{D}*({E})?{FS}?
現在,如果您仔細觀察,沒有規則可以識別0f
。
使用 rule1 我們可以得到0e0f
使用 rule2 我們可以有.0f
或0.0f
使用 rule3 我們可以有0.f
或0.0f
在您的情況下實際發生的是0f
的0
將被詞法分析器作為整數常量D
,而f
將作為FS
令牌使用。 現在,當解析看到D
后跟沒有匹配規則的FS
,它會吐出錯誤:
error: invalid suffix "f" on integer constant
因為0是整數常量。
編輯:codepad.org 給出的錯誤消息(假設為 g++)可能更容易理解。 “錯誤:整數常量上的后綴“f”無效”。 “0.f”會起作用,因為 0.(或 0.0,同樣的東西)是十進制常量,要求十進制常量是浮點數比要求整數常量是浮點數更有意義:)
因為你需要0.0f
。
這是一個“因為”給你的:如果一個帶有f
后綴的int
常量被自動轉換為float
,那么0x0f
將是不明確的。
這不一定是唯一的原因,但l
或L
后綴可以應用於整數文字或浮點文字。 42L
是long int
類型; 42.0L
是long double
類型。
必須消除帶有L
后綴的數字文字的歧義,以確定它是整數還是浮點數。 允許F
后綴本身來確定文字的類型會不一致並且可能會造成混淆。 這也會使在該語言的未來版本中添加新后綴變得更加困難。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.