[英]Why does the C standard state that string literals shall begin and end in the initial shift state?
ANSI X3.159-1989“編程語言 C”標准在“5.2.1.2 - 多字節字符”一章中指出:
對於源字符集,應滿足以下條件:
- 注釋、字符串文字、字符常量或標題名稱應以初始移位狀態開始和結束。
這是否意味着字符串文字等應以字符開頭和結尾,由初始移位狀態的值表示,即單字節值? 或者這是否意味着環境應在處理某個字符串文字等之前和之后將其當前移位狀態重置為初始移位狀態?
為什么這樣? - 即設置初始移位狀態的目的是什么,特別是在字符串文字等的末尾?
為什么 C 標准規定字符串文字應以初始移位狀態開始和結束?
讓我們首先看看“轉變狀態”到底是什么意思(或與規范一樣):
多字節字符可以具有與狀態相關的編碼,其中每個多字節字符序列以初始移位狀態開始,並在序列中遇到特定多字節字符時進入其他實現定義的移位狀態。 在初始移位狀態下,所有單字節字符都保留其通常的解釋並且不會改變移位狀態。 序列中后續字節的解釋是當前移位狀態的函數。
要求字符串文字以初始移位狀態開始和結束使字符串語義更簡單且更可預測。 如果你連接兩個字符串,或者一個接一個地輸出它們,你可以確信它們的並置不會改變后者的含義。 如果第一個可以以不同於初始狀態的換檔狀態終止,那么這將無法保證。
所有這一切的內在假設是語言級語義不知道任何特定字符編碼的細節。 它們將所有字符串視為字節的黑盒,以空字符終止。
- 這是否意味着字符串文字等應以字符開頭和結尾,由初始移位狀態的值表示,即單字節值? 或者這是否意味着環境應在處理某個字符串文字等之前和之后將其當前移位狀態重置為初始移位狀態?
兩者都不。 對於依賴於狀態的編碼,當前移位狀態是對編碼字符序列的解釋的運行屬性。 字符不一定直接編碼移位狀態,但編碼方案提供了一種指定移位狀態變化的方法。
細節可能隨特定的編碼方案而變化,但編碼字符,無論是單字節還是多字節,通常並不固有地處於特定的移位狀態。 這種編碼的重點是相同的子序列可以根據移位狀態進行不同的解釋。 因此,從初始移位狀態開始是關於如何解釋多字節字符序列的斷言,並且僅暗示關於字符串文字必須包含什么的陳述。
另一方面,以初始移位狀態結束是對字符串等內容的約束。 如果字符串文字等的字節,則 AC 源文件格式不正確。 內部,解釋為從初始移位狀態開始,對一個或多個狀態移位進行編碼,使得字節序列末尾的移位狀態與初始移位狀態不同。 這正是為了讓實現不必擔心編碼問題,並且絕對不需要它執行任何類型的移位狀態清理。
- 為什么這樣? - 即設置初始移位狀態的目的是什么,特別是在字符串文字等的末尾?
它簡化了語言並提高了以狀態相關源編碼編寫的 C 源文件的可維護性。 接受用戶定義的自由(ish)文本的每個單元都是模塊化的——無論周圍的上下文如何,它都具有相同的、明確定義的含義,並且移動、復制或刪除這些單元不能改變周圍標記的詞匯解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.