2-1
(1)short, int, long, long long 的区别:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07JKbSR7-1581597379848)(img/2/1.png)]
并且标准还要求这些类型满足:1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
(2)无符号类型和有符号类型的区别:
signed能够表示有符号的数,包括正数,负数,0
unsigned只能表示没有符号的数,包括正数,0
(3)float和double的区别是什么:
float是单精度浮点类型,通常占用32位
double是双精度浮点类型,通常占用64位
2-2
这些跟金钱相关的量可能是浮点数,因此使用double保存比较合适,特殊情况下可以使用long double
2-3
32
4294967264 这里涉及到复数转换为无符号数,可以直接用二进制补码计算。结论就是转换后的结果是负数加上该无符号类型的模值
32
-32
0
0
注意表达式中尽量不要混用无符号类型和有符号类型的变量,否则有符号类型会自动转换为无符号类型
2-4
#include<iostream>
using namespace std;
int main()
{
unsigned u = 10, u2 = 42;
cout << u2 - u << endl;
cout << u - u2 << endl;
int i = 10, i2 = 42;
cout << i2 - i << endl;
cout << i - i2 << endl;
cout << i - u << endl;
cout << u - i << endl;
system("pause");
}
2-5
(1)char,wchar_t,const char *,const wchar_t *
(2)int,unsigned int,long int,unsigned long int,八进制int,十六进制int
(3)double,float,long double
(4)int,unsigned int,double,double
注意默认的浮点数字面值是double类型
2-6
第二组定义错误,超出八进制表示范围,编译器会报错。
2-7
Who gose with Fergus?
1024F是错误的,1024是一个整数后面不能出现浮点数的后缀,可以改成1024.F
#include<iostream>
using namespace std;
int main()
{
cout << "Who gose with F\145rgus?\012" << endl;
cout << 3.14e1L << endl;
//float f = 1024.f;
cout << 1024.f <<endl;
cout << 3.14L << endl;
system("pause");
return 0;
}
2-8
#include<iostream>
using namespace std;
int main()
{
cout << "2M\n";
cout << "2\nM\n";
system("pause");
return 0;
}
2-9
(1)改为
int input_value;
cin>>input_value;
(2)使用列表初始化的方法初始化内置类型对象时,如果可能存在信息丢失会报错
(3)改为
double salary, wage;
salary = wage = 9999.99;
(4)会引发警告,但是可以通过编译
2-10
内置类型在全局作用域会进行默认初始化,内置类型在局部作用于不会进行默认初始化,初值随机。类类型是否默认初始化由类自己决定。
因此global_int是0,local_int随机,字符串总是位空串。
2-11
(1)定义
(2)声明并定义
(3)声明
2-12
a,c,d非法
2-13
100
2-14
100 45
循环内的局部变量 i 在循环结束之后就消失了
2-15
b非法,非常量引用的初始值必须是左值,下面的写法可以
const int &iref = 3.14;
d非法,引用必须具有初始值
2-16
全部合法
2-17
结果都是10
2-18
#include<iostream>
using namespace std;
int main()
{
int i = 1, j = 2, * p = &i;
cout << "p = " << p << endl;
p = &j;
cout << "p = " << p << endl;
cout << "*p = " << *p << endl;
*p = 10;
cout << "*p = " << *p << endl;
system("pause");
return 0;
}
2-22
任何非0指针作为条件表达式结果都是true
当指针变量被赋值为0,NULL,nullptr的时候为false
2-23
如果指针都做了正确的初始化,则判断指针是否指向有效对象只要通过if§即可
如果指针没有被初始化,则没有任何办法判断其指向是否合法
2-26
a不合法,const对象必须初始化
d不合法,const对象初始化以后再也不能更改
2-27
a非法,非常量引用不可以引用字面值
f非法,不存在常量引用这种说法,因为语法上看引用不是对象,不能用const修饰,含以上看引用本来就是不可能改变的。
2-28
注意顶层const表示对象自身不能改变,因此必须初始化
2-31
注意赋值操作对等号两边的顶层const没有影响,因为顶层const是限制对象自身不可修改,而赋值两边的对象并没有关系,因此赋值操作不会破坏顶层const
等号两边底层const要统一,或者左边变量具有底层const而右边没有也可以
2-38
C++中类型推导有两种方式:auto和decltype,他们的区别主要有以下方面:
- auto要求编译器计算表达式的结果,确定变量的初始值,根据初始值来决定变量的类型,而decltype通过编译器分析表达式的类型,并不会计算表达式
- auto可能会对初始值的类型做出改变令其更加符合初始化规则,比如忽略掉顶层const。decltype则会保留顶层const
- decltype对表达式的形式敏感,对变量进行类型推导时如果变量自身加了括号那么结果时变量本身的类型,如果变量本身右括号(两层括号)则结果总是一个引用。
#include<iostream>
#include<typeinfo>
using namespace std;
int main()
{
//decltype对表达式形式敏感
int a = 3;
auto c1 = a;
decltype(a) c2= a;
decltype((a)) c3 = a;
//auto忽略顶层const
const int b = 1;
auto d1 = b;
decltype(b) d2 = b;
cout << typeid(c1).name() << endl;
cout << typeid(c2).name() << endl;
cout << typeid(c3).name() << endl;
cout << typeid(d1).name() << endl;
cout << typeid(d2).name() << endl;
//d2++;
system("pause");
return 0;
}
2-42
//头文件
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include<string>
using namespace std;
struct Sales_data
{
string ISBN = "";
unsigned int unit_sold = 0;
double revenue = 0.0;
};
#endif
//源文件
#include<iostream>
#include"Sales_data.h"
using namespace std;
int main()
{
Sales_data item1, item2;
double price = 0.0;
cin >> item1.ISBN >> item1.unit_sold >> price;
item1.revenue = item1.unit_sold*price;
cin >> item2.ISBN >> item2.unit_sold >> price;
item2.revenue = item2.unit_sold*price;
if (item1.ISBN == item2.ISBN) {
cout << item1.ISBN
<<" "
<< item1.unit_sold + item2.unit_sold
<<" "
<< item1.revenue + item2.revenue << endl;
}
system("pause");
return 0;
}