【C#语言规范版本5.0学习】2 词法结构(二、文本)
文本 (literal) 是一个值的源代码表示形式。
literal: boolean-literal integer-literal real-literal character-literal string-literal null-literal
⟰ 布尔值
有两个布尔文本值:true 和 false。
boolean-literal:
true
false
boolean-literal 的类型是 bool。
⟰ 整 数
整数文本用于编写类型为 int、uint、long 和 ulong 的值。整数有两种可能的形式:十进制和十六进制。
integer-literal: decimal-integer-literal hexadecimal-integer-literal decimal-integer-literal: decimal-digits integer-type-suffixopt decimal-digits: decimal-digit decimal-digits decimal-digit decimal-digit: one of 0 1 2 3 4 5 6 7 8 9 integer-type-suffix: one of U u L l UL Ul uL ul LU Lu lU lu hexadecimal-integer-literal: 0x hex-digits integer-type-suffixopt 0X hex-digits integer-type-suffixopt hex-digits: hex-digit hex-digits hex-digit hex-digit: one of 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f
一个整数的类型按下面的方式确定:
✹ 如果该整数没有后缀,则它属于以下所列的类型中第一个能够表示其值的那个类型:int、uint、 long、ulong。
✹ 如果该文本带有后缀 U 或 u,则它属于以下所列的类型中第一个能够表示其值的那个类型:uint、 ulong。
✹ 如果该整数带有后缀 L 或 l,则它属于以下所列的类型中第一个能够表示其值的那个类型:long 和 ulong。
✹ 如果该文本带有后缀 UL、Ul、uL、ul、LU、Lu、lU 或 lu,它的类型为 ulong。
如果整数表示的值超出了 ulong 类型的范围,则将发生编译时错误。 从书写风格(样式)的角度出发,建议在书写类型 long 的文本时使用“L”而不是“l”,因为字母 “l”容易与数字“1””混淆。
为允许尽可能小的 int 和 long 值写为十进制整数,有下面两个规则:
✺ 当具有值 2147483648 (231) 且没有 integer-type-suffix 的一个 decimal-integer-literal 作为标记紧接在一元负运算符标记后出现时,结果为具有值 −2147483648 (−2 31) 的 int 类型常量。在所有其他情况下,这样的 decimal-integer-literal 属于 uint 类型。
✺ 当具有值 9223372036854775808 (263) 的一个 decimal-integer-literal(没带 integer-type-suffix,或带有 integer-type-suffix L 或 l)作为一个标记紧跟在一个一元负运算符标记后出现时,结果是具有值 −9223372036854775808 (−2 63) 的 long 类型的常量。在所有其他情况下,这样的 decimal-integer-literal 属于 ulong 类型。
⟰ 实数
实数文本用于编写类型为 float、double 和 decimal 的值。
real-literal: decimal-digits . decimal-digits exponent-partopt real-type-suffixopt
. decimal-digits exponent-partopt real-type-suffixopt decimal-digits exponent-part real-type-suffixopt decimal-digits real-type-suffix exponent-part: e signopt decimal-digits E signopt decimal-digits sign: one of + - real-type-suffix: one of F f D d M m
如果未指定 real-type-suffix,则实数的类型为 double。否则,实数类型后缀确定实数的类型,如下所示:
☯ 以 F 或 f 为后缀的实数文本的类型为 float。例如,文本 1f、1.5f、1e10f 和 123.456F 的类型都 是 float。
☯以 D 或 d 为后缀的实数的类型为 double。例如,实数 1d、1.5d、1e10d 和 123.456D 的类型都是 double。
☯ 以 M 或 m 为后缀的实数的类型为 decimal。例如,实数 1m、1.5m、1e10m 和 123.456M 的类型都是 decimal。此实数通过取精确值转换为 decimal 值,如果有必要,用银行家舍入法舍入为最接近的可表示值。保留该实数的所有小数位数,除非值被舍入或者值为零(在后一种情况中,符号和小数位数为 0)。因此,实数 2.900m 经分析后将形成这样的一个小数:符号为 0、系数为 2900,小数位数为 3。
如果一个给定的实数不能用指定的类型表示,则会发生编译时错误。 使用 IEEE“就近舍入”模式确定类型 float 或 double 的实数的值。 注意在实数中,小数点后必须始终是十进制数字。例如,1.3F 是实数,但 1.F 不是。
⟰ 字 符
字符表示单个字符,通常由置于引号中的一个字符组成,如 'a'。
character-literal:
' character ' character: single-character simple-escape-sequence hexadecimal-escape-sequence unicode-escape-sequence single-character: Any character except ' (U+0027), \ (U+005C), and new-line-character simple-escape-sequence: one of \' \" \\ \0 \a \b \f \n \r \t \v hexadecimal-escape-sequence: \x hex-digit hex-digitopt hex-digitopt hex-digitopt
在 character 中跟在反斜杠字符 (\) 之后的字符必须是以下字符之一:'、"、\、0、a、b、f、n、r、t、 u、U、x 和 v。
其他情况下,将发生编译时错误。 十六进制转义序列表示单个 Unicode 字符,它的值由“\x”后接十六进制数组成。 如果一个字符表示的值大于 U+FFFF,则将发生编译时错误。
字符中的 Unicode 字符转义序列必须在 U+0000 到 U+FFFF 的范围内。 一个简单转义序列表示一个 Unicode 字符编码,详见下表。
character-literal 的类型为 char。
⟰ 字符串
C# 支持两种形式的字符串:常规字符串 (regular string literal) 和原义字符串 (verbatim string literal)。
常规字符串由包含在双引号中的零个或多个字符组成(如 "hello"),并且可以包含简单转义序列(如表示制表符的 \t)、十六进制转义序列和 Unicode 转义序列。
原义字符串由 @ 字符后跟开始的双引号字符、零个或多个字符以及结束的双引号字符组成。
一个简单的示例就是 @"hello"。在原义字符串中,分隔符之间的字符逐字解释,唯一的例外是 quote-escapesequence。具体而言,在原义字符串中不处理简单转义序列以及十六进制和 Unicode 转义序列。原义字符串可以跨多行。
string-literal: regular-string-literal verbatim-string-literal regular-string-literal:
" regular-string-literal-charactersopt " regular-string-literal-characters: regular-string-literal-character regular-string-literal-characters regular-string-literal-character regular-string-literal-character: single-regular-string-literal-character simple-escape-sequence hexadecimal-escape-sequence unicode-escape-sequence single-regular-string-literal-character: Any character except " (U+0022), \ (U+005C), and new-line-character verbatim-string-literal: @" verbatim-string-literal-charactersopt " verbatim-string-literal-characters: verbatim-string-literal-character verbatim-string-literal-characters verbatim-string-literal-character verbatim-string-literal-character: single-verbatim-string-literal-character quote-escape-sequence single-verbatim-string-literal-character: Any character except " quote-escape-sequence:
""
在 regular-string-literal-character 中跟在反斜杠字符 (\) 之后的字符必须是以下字符之一:'、"、\、0、 a、b、f、n、r、t、u、U、x、v。其他情况下,将发生编译时错误。 下面的示例
string a = "hello, world"; // hello, world string b = @"hello, world"; // hello, world string c = "hello \t world"; // hello world string d = @"hello \t world"; // hello \t world string e = "Joe said \"Hello\" to me"; // Joe said "Hello" to me string f = @"Joe said ""Hello"" to me"; // Joe said "Hello" to me string g = "\\\\server\\share\\file.txt"; // \\server\share\file.txt string h = @"\\server\share\file.txt"; // \\server\share\file.txt string i = "one\r\ntwo\r\nthree"; string j = @"one two three";
演示了各种不同的字符串。最后一个字符串 j 是跨多行的原义字符串。引号之间的字符(包括空白,如换行符等)也逐字符保留。
由于十六进制转义序列可以包含数目可变的十六进制数字,因此字符串 "\x123" 只包含一个具有十六进制值 123 的字符。若要创建一个包含具有十六进制值 12 的字符,后跟一个字符 3 的字符串,可以改写为 "\x00123" 或 "\x12" + "3"。 string-literal 的类型为 string。
每个字符串文本不一定产生新的字符串实例。当根据字符串相等运算符确认为相等的两个或更多个字符串出现在同一个程序中时,这些字符串引用相同的字符串实例。例如,
class Test { static void Main() { object a = "hello"; object b = "hello"; System.Console.WriteLine(a == b); } }
产生的输出为 True,这是因为两个字符串引用相同的字符串实例。
⟰ null 文本
null-literal: null 可以将 null-literal 隐式转换为引用类型或可以为 null的类型。