C++ Primer 学习之路-第二章-变量和基本类型(2.1-2.2)
2.1 基本内置类型
表2.1:C++:算术类型
类型 | 含义 | 最小尺寸 |
---|---|---|
bool(取值为true或false) | 布尔类型 | 未定义 |
char | 字符 | 8位 |
wchar_t | 宽字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 32位 |
short | 短整型 | 16位 |
int | 整形 | 16位 |
long | 长整形 | 32位 |
long long | 长整形 | 64位 |
float | 单精度浮点数 | 6位有效数字 |
double | 双精度浮点数 | 10位有效数字 |
long double | 拓展精度浮点数 | 10位有效数字 |
除bool型和拓展的字符型之外,其他整型都可分为 有符号(signed) 和 无符号(unsigned) 两种。
习题2.1:
类型int、long、long long和short的区别是什么?无符号类型和带符号类型的区别是什么?float和double的区别是什么?
答:
int、long、long long和short均为整形,但各个类型的最小尺寸不同,short和int为16位,long为32位,long long为64位。
无符号类型只能表示大于等于0的数,有符号类型可以表示正数、负数和0。
float位单精度浮点数,double位双精度浮点数;float占4个字节,有效数字7位;double占8个字节,有效数字16位。
习题2.2:
计算机按揭房贷时,对于利率、本金和付款分别应选择何种数据类型?说明你的理由。
答:对于利率、本金和付款,都有可能是整数或实数,所以可以选择float,double,long double。为了保证精度和计算运行的耗时,所以均选用double类型(long double提供的精度过于精细对房贷来说没有必要且耗时较长)。
习题2.3:
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl; //32
std::cout << u - u2 << std::endl; //4294967264
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl; //32
std::cout << i - i2 << std::endl; //-32
std::cout << i - u << std::endl; //0
std::cout << u - i << std::endl; //0
以0
开头的整数代表八进制数,以0x
或0X
开头的代表十六进制数。
表2.2:常见转义序列:
名称 | 符号 | 名称 | 符号 |
---|---|---|---|
换行符 | \n | 横向制表符 | \t |
纵向制表符 | \v | 退格符 | \b |
反斜线 | \\ | 问号 | \? |
回车符 | \r | 进纸符 | \f |
报警符 | \a | 双引号 | \" |
单引号 | \‘ | 空字符 | \0 |
表2.3:指定字面值的类型:
前缀 | 含义 | 类型 |
---|---|---|
u | Unicode16字符 | char16_t |
U | Unicode32字符 | char32_t |
L | 宽字符 | wchar_t |
u8 | UTF-8(仅用于字符串字面常量) | char |
整型字面值 | 浮点型字面值 | ||
---|---|---|---|
后缀 | 最小匹配类型 | 后缀 | 类型 |
u or U | unsigned | f or F | float |
l or L | long | l or L | long double |
ll or LL | long long |
习题2.5:指出下述字面值的数据类型并说明每一组内几种字面值的区别:
(a )‘a’,L’a’,“a”,L"a"
(b )10,10u,10L,10uL,012,0xC
(c )3.14,3.14f,3.14L
(d )10,10u,10.,10e-2
答:
(a )‘a’ 表示字符a,L’a’表示宽字符型字面值a且类型是wchar_t,"a"表示字符a,L"a"表示宽字符型字面值a且类型是wchar_t。
(b )10表示普通整数类型字面值10,10u表示无符号整数类型字面值10,10L表示长整数类型字面值10,10uL表示无符号长整数类型字面值10,012表示八进制数对应十进制数是10,0xC表示十六进制数对应十进制数是12。
(c )3.14表示普通浮点型字面值是3.14,3.14f表示float类型单精度浮点数,3.14L表示long double类型拓展精度浮点数。
(d )10表示普通整数类型字面值10,10u表示无符号整数类型字面值10,10.表示浮点数,10e-2表示科学计数法表示的浮点数是10x10-2=0.1
习题2.6:下面两组定义是否有区别,如果有,请叙述之:
int month = 9,day = 7;
int month = 09,day = 07;
答:
第一组是定义了两个十进制数10和7,正确
第二组是定义了两个八进制数,但八进制中没有9,所以错误 。
习题2.7:下述字面值表示何种含义?它们各自的数据类型是什么?
(a )“Who goes with F\145rgus?\012”
(b )3.14e1L
(c )1024f
(d )3.14L
答:
(a )“Who goes with F\145rgus?\012” 输出为"Who goes with Fergus?" 其中\145表示e,\012表示换行符。
(b )3.14e1L 科学计数法表示的拓展精度浮点数(long double) 表示为3.14x101=31.4。
(c )1024f 编译错误,若想表示为单精度浮点数(float)应改为1024.f。
(d )3.14L 表示为拓展精度浮点数(long double) 数值为3.14。
习题2.8:请利用转移序列编写一段程序,要求先输出2M,然后转到新一行。修改程序使其先输出2,然后输出制表符,再输出M,最后转到新一行。
答:
#include <iostream>
using namespace std;
int main()
{
cout<<"2\x4d\012"; //\x4d中x4d表示16进制数对应十进制的77,\77表示为M \012对应换行符
cout<<"2\tM\n"; //\t表示制表符,\n表示换行符
return 0;
}
2.2 变量
习题2.9:解释下列定义的含义。对于非法的定义,请说明错在何处并改正。
(a )std::cin >> int input_value; 改为int input_value; std::cin >> input_value; 运算符右侧不能定义变量
(b )int i = { 3.14 }; 有warning,3.14小数部分数据丢失
(c )double salary = wage = 9999.99; 改为 double salary,wage;
(d )int i = 3.14; 有warning,3.14小数部分数据丢失
习题2.10:下列变量的初值分别是什么?
std::string global_str;
int globa_int;
int main()
{
int local_int;
std::string local_str;
}
答:对于string类型来说,在函数体内和外均为空串。对globa_int,在函数体外,初值为0,对local_int,在函数体内,初值为奇异值。
在函数体外初始化时,会被默认初始化为0。
习题2.11:指出下面语句是声明还是定义:
(a )extern int ix = 1024; 定义
(b )int iy; 声明+定义
(c )extern int iz; 声明
表2.4:C++关键字及操作符替代名:
名称 | 名称 | 名称 | 名称 | 名称 | 名称 | 名称 |
---|---|---|---|---|---|---|
alignas | alignof | asm | auto | bool | break | case |
catch | char | char16_t | char32_t | class | const | constexpr |
const_cast | continue | decltype | default | delete | do | double |
dynamic_cast | else | enum | explicit | export | extern | false |
float | for | friend | goto | if | inline | int |
long | mutable | namespace | new | noexcept | nullptr | operator |
private | protected | public | register | reinterpret_cast | return | short |
signed | sizeof | static | static_assert | static_cast | struct | switch |
template | this | thread_local | throw | true | try | typedef |
typeid | typename | union | unsigned | using | virtual | void |
voliatile | wchar_t | while | and | bitand | compl | |
not_eq | or_eq | xor_eq | and_eq | bitor | not | or |
xor |
习题2.21: 请指出下面的名字中哪些是非法的?
(a )int double = 3.14; 非法,double是关键字代表数据类型 不能作为变量名
(b )int _; 合法
(c )int catch-22; 非法 表示中只能出现字母,数字和下划线。
(d )int 1_or_2 = 1; 非法 标识符必须以字母或下划线开头,不能以数字开头。
(e )double Double = 3.14;
习题2.13:下面程序中j的值是多少?
int i = 42;
int main()
{
int i = 100;
j = i;//j=100
}
习题2.14:下面的程序合法吗?如果合法,输出什么?
int i = 100,sum = 0;
for (int i = 0;i != 10; ++i)
sum +=i;
std::cout<< i <<" "<< sum << std::endl;
答:合法,输出为100 45
。