澄清C 中的數值異常:前導零的意義
在C 程式設計領域,包含前導零的整數文字的行為有時可能會令人困惑。讓我們深入研究這個奇怪的問題並闡明其底層機制。
C 標準將整數文字定義為不含小數點或指數的數字序列。在文字前面加上 0 表示八進位(以 8 為基數)數字,而沒有前綴則表示十進位(以 10 為基數)數字。
但是,請考慮以下程式碼片段:
int i = 07; // i == 7 int i = 16; // i == 16 int i = 00016; // i == 14, why? int i = 05016; // i == 2574, wow )
在第一個範例中,i 設定為值7,因為07 被解釋為八進位值(8 * 0 7 = 7 )。這與 C 將沒有前綴的前導零解釋為八進制數的約定一致。
但是,在後續範例中,前導零出現在十進制數字之前,這引發了問題。根據標準,這些文字不應被接受為八進制數。那麼,這裡發生了什麼事?
答案在於稱為「八進位抑制」的編譯器最佳化。當編譯器遇到前導零後跟十進制數字時,它會抑制八進制解釋並將文字視為十進制。這就解釋了為什麼 00016 被計算為 14,05016 被計算為 2574。
另一方面,08 會觸發編譯錯誤,因為它違反了八進位文字不能包含數字 8 或 9 的標準規則。編譯器期望有效的八進制數,但它發現無效字元並引發錯誤。
以上是為什麼 C 整數文字中的前導零有時會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!