Copyright © 2088 2014男篮世界杯_u20世界杯8强 - malajz.com All Rights Reserved.
友情链接
字符型字面量(character literal)是用單引號括起來的一個或多個字符,可選前綴字符有u、U、L。[4]
沒有前綴字符的稱為普通字符字面量(ordinary character literal)或窄字符字面常量(narrow-character literal)
只包含執行字符集(execution character set)中一個可表示字符的普通字符字面量,如:'a',則其類型為char,其值等於該字符在執行字符集中的編碼值。實際上,編譯器在token分析階段,通常就會把字符與字符串在源文件中的編碼串轉換為指定或者執行字符集的編碼串。
包含多個字符的普通字符字面常量,被稱為多字符字面量(multicharacter literal)[4]。多字符字面量,以及包含執行字符集(execution character set)中一個不可表示字符的普通字符字面量,被有條件支持,具有類型int,其值為實現定義。[5]各常見C/C++編譯器一般都支持如下例子:
// Multicharacter literals
int m0 = 'abcd'; // int, value 0x61626364
需要注意的是,在C語言中字符常量'a'具有int類型,sizeof('a')等於sizeof(int);在C++語言中字符字面量'a'具有char類型,sizeof('a')為1。
使用前綴L u U分別表示wchar_t char16_t char32_t等字符類型的字面量。例如u'y'。一個wchar_t類型的字面量的值,就是該字符在執行寬字符集(execution wide-character set)中的編碼值;單如果該字符在執行寬字符集中不可表示,則其值是實現定義的。一個char16_t類型的字面量的值,就是該字符在Unicode編碼中的16比特的碼位;顯然該字符必須屬於Unicode中的基本多文種平面才能用16比特來編碼,否則程序是病態的。一個char32_t類型的字面量的值,就是該字符在Unicode編碼中的32比特的碼位。這些字符類型在x86平台均為小端序表示。char16_t字面量或char32_t字面量,如果包含多個字符,是病態的。wchar_t 字面量,如果包含多個字符,其值是實現定義的。
由於字符型字面量可能不屬於C/C++的token的字符範圍,這就需要用反斜線\開始的轉義序列來表示一個字符值:
簡單轉義序列:\' \" \? \\ \a \b \f \n \r \t \v 共計11個字符;
八進制轉義序列:如 \1 \12 \123等等,直至不是八進制數字為止,最多使用3位八進制數字;
十六進制轉義序列:如 \x1abf4 ,可以使用任意多的十六進制數字,直至不是十六進制數字為止;
通用字符名(universe-character name):\u後面必須跟4個十六進制數字(不足四位前面用零補齊),表示Unicode中在0至0xFFFF之內的碼位(但不能表示0xD800到0xDFFF之內的碼點,Unicode標準規定這個範圍內的碼位保留,不表示字符);
32位的通用字符名:\U後面必須跟8個十六進制數字(不足八位前面用零補齊),表示Unicode中所有可能的碼位(除0xD800到0xDFFF之外)。
上述兩種Unicode轉義序列的字符表示法,由編譯器自動轉換為相應的字符內部編碼格式。如為wchar_t字符。
如果字符字面量的值超過了char、char16_t、char32_t、wchar_t實現定義的範圍,那麼其值是實現定義的。例如,源文件是Latin-1編碼,執行字符集為utf-8,則char c='ö';中的字符值將被編譯器從Latin-1編碼的單字節的0xD6自動轉為utf-8編碼的雙字節的0xC3B6,在目標文件與可執行文件中字符c的值是'ö'的utf-8編碼值的最後一個字節值即0xB6。
為支持老的代碼,C語言規定了三字符組替換,在掃描處理C語言源文件時,替換下述的3字符出現為1個字符:
三字符組
替換為
??=
#
??/
\
??'
^
??(
[
??)
]
??!
|
??<
{
??>
}
??-
~
如果希望在源程序中有兩個連續的問號,且不希望被預處理器替換,這種情況出現在字符字面常量、字符串字面常量或者是程序注釋中,可選辦法是用字符串的自動連接:"...?""?..."或者轉義序列:"...?\?..."。
從Microsoft Visual C++ 2010版開始,該編譯器默認不再自動替換三字符組。如果需要使用三字符組替換(如為了兼容古老的軟件代碼),需要設置編譯器命令行選項/Zc:trigraphs
gcc默認不識別三字符組,並會給出編譯警告。在指定了C/C++標準時,gcc才會識別三字符組,但仍會給出編譯警告。