2.1.2 类型转换
几条简单的理解:
- 系统会自动进行一些基本类型的转换,使用时要注意。
- 非0值都为true,0为true。
- 浮点数转换为整数时会自动去掉小数部分。
- 无符号类型超出范围会溢出,结果是对其最大值取模后的值。
- 带符号类型超出范围会表现为未定义(undefined)。
- 要注意带符号类型和无符号类型的混合表达式的计算,表达式会自动把带符号对象的值变成无符号的值。
2.1.2 习题
- 练习2.3: 读程序写结果
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl;
std::cout << u - u2 << std::endl;
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl;
std::cout << i - i2 << std::endl;
std::cout << i - u << std::endl;
std::cout << u - i << std::endl;
u和u2都是无符号类型,因此:
u2-u = 42-10=32
u-u2=10-42=-32
,由于unsigned不能为负值,且int值长度为32位,所以结果为2的32次方-32,即4294967264。
i和i2都是int型,如果与u或u2混合计算,在计算时会先将带符号对象的值变成无符号的值。
i2-i=42-10=32
i-i2=10-42=-32
i - u = 10 - 10 = 0
u-i = 10-10 = 0
- 练习2.4:编写程序验证
运行结果与理解一致。
2.1.3 字面值常量
几个要点:
- 字面值都是常量,字面值常量的形式决定了它对应的类型。
- 整型字面值可以写成十进制、八进制(
0
开头)、十六进制(0x
或0X
开头)的形式,其中十进制可以是带符号类型,八进制和十六进制是不带符号类型,而具体是int、long还是longlong(对于八进制和十六进制还要加上unsigned),会取其可以容纳的最小尺寸的类型。注意short没有对应的字面值。如果字面值过大导致对应的类型无法容纳,将会报错。 - 浮点型常量默认为double,但是可以通过后缀指定,
f或F
为float型,l或L
为long double型。注意,有以下几种写法:3.1415
、3.14159E0
、0.
、0e0
、.001
。 - 注意,字面值不会为负数,十进制虽然可以加
-
号,但其字面值并不包含这个-
. - char类型的字面值常量使用单引号
' '
括起来,字符串字面值常量使用""
括起来。 - 注意转义序列的使用,在
\
之后可以使用八进制代表字符。 - 字面值类型可以通过前缀或后缀进行指定,常用的有
u(小写)
指定Unicode16,U(大写)
指定Unicode32,L
指定宽字符(wchar_t),u8
指定UTF-8编码字符,注意u8
仅用于字符串常量 。 - true和false是布尔型的字面常量值。(恐怕也是最常用的字面常量值了)
- 指针的字面常量值是nullptr。
2.1.3练习
- 练习2.5 :指出下述字面值的数据类型并说明每一组内几种字面值的区别
(a) ‘a’ , L’a’ , “a” , L"a" //'a’是char类型,L是宽字符前缀,L’a’是wchar_t类型,"a"是char类型字符组成的字符串,L"a"是wchar_t类型的值组成的字符串。
(b) 10, 10u, 10L, 10uL, 012, 0xC //10是int类型,10u是unsigned int型,10L是 long 类型,012是八进制数字 unsigned int型,0xC是十六进制数字 unsigned in型。
© 3.14, 3.14f, 3.14L // 分别是double、float、long double
(d) 10,10u, 10., 10e-2 //分别是int 、undesigned int、float、double型。
- 练习2.6:下面两组定义是否有区别?
int month = 9, day = 7;
int month = 09, day = 07;
答:有区别。上一行是普通的十进制数,后一行是以0开头,是八进制数。这里由于八进制最大的数为7,所以09会在编译时报错,提示error C2041: 非法的数字“9”(用于基“8”)
。
- 练习2.7:下述字面值表示何种含义?它们各自的数据类型是什么 ?
(a) “Who gose with F\145rgus?\012”
(b) 3.14e1L
© 1024f
(d) 3.14L
答:
(a) 是字符串字面值,类型是char字符的数组。其中中有两个转义字符,\145的值为’e’,\012的值为换行符
(b) 是科学计数法计数的浮点型字面值,表示long double类型的值,其值为31.4.
© 是后缀f指定的浮点型字面值,在有的编译器中会报错,其本质是一个整型的字面值加了f后缀。
(d) 是指定long double类型的值,其值为3.14
- 练习2.8:请利用转义序列编写一段程序 ,要求先输出 2M,然后转到新一行。修改程序使其先输出2,然后输出制表,再输出M,最后转到新一行。
这里原意有可能是2和M也使用转义字符输入,数字的转义序列编码太难查找,这里就直接使用2和M输入了。
//先输出2M再转到新一行:
#include <iostream>
using namespace std;
int main()
{
cout<< "2M\n" <<endl;
return 0;
}
// 先输出2,然后输出制表,再输出M,最后转到新一行:
#include <iostream>
using namespace std;
int main()
{
cout<< "2\tM\n" <<endl;
return 0;
}
总结
虽然有很多都是以前就接触过的知识,但是还是有不少新的内容,在具体使用时可以有更多的选择应用。