字面值常量的相关问题
首先看这个就跟没定义一样的定义:像 42 这样的值,在程序中被当作“字面值常量”。>_<|||....
1. 称之为字面值是因为只能用它的值称呼它,称之为常量是因为它的值不能修改。
2. 每个字面值都有相应的类型,例如:0 是 int 型,3.14159 是 double 型。
(注意:只有内置类型存在字面值,没有类类型的字面值。因此,也没有任何标准库类型的字面值。)
一、整型字面值规则 -- Rules for Integer Literals
定义字面值整数常量可以使用十进制、八进制和十六进制中的任一种形式来表示,例如,我们能将值 20 定义
20 // decimal 我们通常的写法
024 // octal 以 0(零)开头
0x14 // hexadecimal 以 0x 或 0X 开头
(注意:这些进制仅仅是不同的写法,并不会改变整型字面值对应的二进制位的表示形式!)
1. 通过增加后缀,能够强制将字面值整数常量转换为 long、unsigned 或 unsigned long 类型。通过在数值后面加 L 或者 l(字母“l”大写或小写)指定常量为 long 类型。
2. 类似地,可通过在数值后面加 U 或 u 定义 unsigned 类型。同时加 L 和 U 就能够得到 unsigned long 类型的字面值常量。但其后缀不能有空格:
128u /* unsigned */ 1024UL /* unsigned long */
1L /* long */ 8Lu /* unsigned long */
3. 没有 short 类型的字面值常量。(我也不知道为什么没有,反正没有就是没有! >_</// )
二、浮点字面值规则 -- Rules for Floating-Point Literals
通常可以用十进制或者科学计数法来表示浮点字面值常量。
1. 使用科学计数法时,指数用 E 或者 e 表示。默认的浮点字面值常量为 double 类型。
2. 在数值的后面加上 F 或 f 以后才会表示单精度。同样,加上 L 或者 l 表示扩展精度。
3. 下面每一组字面值表示相同的值:
3.14159F .001f 12.345L 0.
3.14159E0f 1E-3F 1.2345E1L 0e0
三、布尔字面值和字符字面值 -- Boolean and Character Literals
1. 单词 true 和 false 是布尔型的字面值。
2. 可打印的字符型字面值通常用一对单引号来定义: char ch1 = 'a'; char2 = '2'; char3 = ','; char4 = ' '; // blank
3. 在字符字面值前加 L 就能够得到 wchar_t 类型的宽字符字面值。如: L'a'
四、非打印字符的转义序列 -- Escape Sequences for Nonprintable Characters
1. 不可打印字符实际上是不可显示的字符,比如退格或者控制符。
2.还有一些在语言中有特殊意义的字符,例如单引号、双引号和反斜线符号。
3. 不可打印字符和特殊字符都用转义字符书写。转义字符都以反斜线符号开始,常用转义字符定义如下:
\n (换行符) \r (回车符) \t (水平制表符) \b (退格符)
4. 不得不说的字符'\0', 通常表示“空字符(null character)”——这货可是有着非常特殊的意义的存在啊!你迟早会明白的!
五、字符串字面值 -- Character String Literals
字符串字面值常量用双引号括起来的零个或者多个字符表示。其中的不可打印字符表示成相应的转义字符。
"Hello World!" // simple string literal
"" // empty string literal
"\nCC\toptions\tfile.[cC]\n" // string literal using newlines and tabs
1. 为了兼容 C 语言,C++ 中所有的字符串字面值都由编译器自动在末尾添加一个空字符。
字符字面值: 'A' // 表示单个字符 A
然而, "A" // 表示包含字母 A 和空字符两个字符的字符串。
2. 正如存在宽字符字面值,也存在宽字符串字面值,宽字符串字面值是一串常量宽字符,同样以一个宽空字符结束。
一样是在前面加“L”,如: L"a wide string literal"
七、字符串字面值的连接 -- Concatenated String Literals
两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字面值。
1. 这使得多行书写长字符串字面值变得简单:
std::cout << "a multi-line "
"string literal "
"using concatenation"
<< std::endl;
执行这条语句将会输出: a multi-line string literal using concatenation
2. 如果连接字符串字面值和宽字符串字面值,结果是未定义的。例如:
std::cout << "multi-line " L"literal " << std::endl;
这个程序可能会执行,也可能会崩溃或者产生没有用的值,而且在不同的编译器下程序的动作可能不同。
3. 另一个方法,依赖于程序格式化特性:在一行的末尾加一反斜线符号可将此行和下一行当作同一行处理。
注意:反斜线符号必须是该行的尾字符——不允许有注释或空格符。
同样,后继行行首的任何空格和制表符都是字符串字面值的一部分。