C++ Primer学习笔记 - 7 - 基本内置类型 (二)

2.1.2 类型转换

几条简单的理解:

  1. 系统会自动进行一些基本类型的转换,使用时要注意。
  2. 非0值都为true,0为true。
  3. 浮点数转换为整数时会自动去掉小数部分。
  4. 无符号类型超出范围会溢出,结果是对其最大值取模后的值。
  5. 带符号类型超出范围会表现为未定义(undefined)。
  6. 要注意带符号类型和无符号类型的混合表达式的计算,表达式会自动把带符号对象的值变成无符号的值。

2.1.2 习题

  1. 练习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

  1. 练习2.4:编写程序验证
    运行结果也一致
    运行结果与理解一致。

2.1.3 字面值常量

几个要点:

  1. 字面值都是常量,字面值常量的形式决定了它对应的类型。
  2. 整型字面值可以写成十进制、八进制(0开头)、十六进制(0x0X开头)的形式,其中十进制可以是带符号类型,八进制和十六进制是不带符号类型,而具体是int、long还是longlong(对于八进制和十六进制还要加上unsigned),会取其可以容纳的最小尺寸的类型。注意short没有对应的字面值。如果字面值过大导致对应的类型无法容纳,将会报错。
  3. 浮点型常量默认为double,但是可以通过后缀指定,f或F为float型,l或L为long double型。注意,有以下几种写法: 3.14153.14159E00.0e0.001
  4. 注意,字面值不会为负数,十进制虽然可以加-号,但其字面值并不包含这个-.
  5. char类型的字面值常量使用单引号' '括起来,字符串字面值常量使用""括起来。
  6. 注意转义序列的使用,在\之后可以使用八进制代表字符。
  7. 字面值类型可以通过前缀或后缀进行指定,常用的有u(小写)指定Unicode16,U(大写)指定Unicode32,L指定宽字符(wchar_t),u8指定UTF-8编码字符,注意u8仅用于字符串常量 。
  8. true和false是布尔型的字面常量值。(恐怕也是最常用的字面常量值了)
  9. 指针的字面常量值是nullptr。

2.1.3练习

  1. 练习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型。

  1. 练习2.6:下面两组定义是否有区别?

int month = 9, day = 7;
int month = 09, day = 07;

答:有区别。上一行是普通的十进制数,后一行是以0开头,是八进制数。这里由于八进制最大的数为7,所以09会在编译时报错,提示error C2041: 非法的数字“9”(用于基“8”)

  1. 练习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

  1. 练习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;
}

总结

虽然有很多都是以前就接触过的知识,但是还是有不少新的内容,在具体使用时可以有更多的选择应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值