第一章 开始
课后习题及答案:
https://blog.csdn.net/qq_29762941/article/details/82658064
1.在main函数中return 0 和 return -1的区别
对程序执行来说,没有区别;0 和-1 最终以程序退出状态码返回,代表该程序执行是否有异常。
该问题可以延伸到main函数是如何被执行的:
fork()->execve()->_start启动例程->为main函数执行准备好argc、argv、envp等->调用main()->回到启动例程,执行exit(main函数的返回状态码)->exit()会执行一些退出函数,比如刷新,关闭文件描述符等操作。
参考:https://cloud.tencent.com/developer/article/1439033
2.std::cin, std::cout, printf, scanf的用法及实现
1)cin、cout头文件; printf、scanf头文件<stdio.h>
2) cin、scanf多个输入参数之间,用空格或enter键都可以,如果一个输入参数里包含空格,那么空格之后的内容会丢失;
3)用法参考:
https://www.cnblogs.com/MAX-ZMY/p/11540058.html
https://blog.csdn.net/weixin_44023525/article/details/84963597
4)实现:没找到
3.重定向标准输入、标准输出
< 文件名 重定向了标准输入;> 文件名 重定向了标准输出;
./程序名 < 文件名 > 文件名
第二章 变量和基本类型
1.基本内置类型
1)算术类型:字符、整型、布尔、浮点
char、wchar_t:
https://blog.csdn.net/freestyle4568world/article/details/49591739
https://blog.csdn.net/cwj649956781/article/details/15338129
2)整型、浮点型、单精度、双精度:
https://blog.csdn.net/zyhmz/article/details/570754733) 空类型:用于特殊场合,不对应具体的值,如return void
2.类型转换
https://www.jianshu.com/p/c678e5dab87e
猜测:编译器会将类型转换翻译成命令?
3.变量
1)声明和定义:
https://www.jianshu.com/p/92e81ecc8737
2)struct和数组的初始化为0的方法:
https://blog.csdn.net/wordwarwordwar/article/details/85001876
4.复合类型
1) 引用:别名;必须初始化,一旦与初始值绑定,不可解绑再重新赋值。不可赋空值。
https://blog.csdn.net/weixin_34240520/article/details/864032682)指针:指针本身就是对象,可以不初始化,但建议初始化,否则易引起运行时错误。
3)引用和指针的区别:
https://blog.csdn.net/u012611644/article/details/89055038
https://baijiahao.baidu.com/s?id=1624099009536720942&wfr=spider&for=pc
汇编代码:从汇编来看,引用是个常量指针,大小和指针一样大,是有内存空间的
15: int x = 0;
008118AE C7 45 F8 00 00 00 00 mov dword ptr [x],0
16: int& y = x;
008118B5 8D 45 F8 lea eax,[x]
008118B8 89 45 EC mov dword ptr [y],eax
17: int* z = &x;
008118BB 8D 45 F8 lea eax,[x]
008118BE 89 45 E0 mov dword ptr [z],eax
18: y = 3;
008118C1 8B 45 EC mov eax,dword ptr [y]
008118C4 C7 00 03 00 00 00 mov dword ptr [eax],3
19: *z = 4;
008118CA 8B 45 E0 mov eax,dword ptr [z]
008118CD C7 00 04 00 00 00 mov dword ptr [eax],4
dword 双字 就是四个字节 ptr pointer缩写 即指针 []里的数据是一个地址值,这个地址指向一个双字型数据
比如mov eax, dword ptr [12345678] 把内存地址12345678中的双字型(32位)数据赋给eax
5.const 限定符
顶层const\底层const
https://blog.csdn.net/jinsan0129/article/details/81907900
6.处理类型
1)typedef\using
2)auto\decltype
https://blog.csdn.net/wk_bjut_edu_cn/article/details/81951764
3)auto、decltype的区别
auto不仅推导了类型,还进行了初始化;而decltype只采用类型;
auto在推导数组的类型时,会将数组名转换为指针;而decltype不会;
auto在推导类型时,会忽略顶层const,而decltype不会;
加双层括号的decltype得到的类型永远是引用;
https://blog.csdn.net/chigusakawada/article/details/80071295
第三章 字符串、向量和数组
推荐使用!= 和 == 而不是<、>来做判断,因为C++的大多数容器都重载了!= 等,但没有重载<、>等。
1.using
1)命名空间的使用
2)起别名:using int_array = int[4];
(等同于C语言中的typedef int int_array[4] )
2.标准库类型string
1)string对象的初始化:直接初始化(用构造函数),拷贝初始化(用一个已有的对象来初始化)
2) string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白位置3) getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到那个string对象中去(注意不存换行符)。
3.C风格字符串
1)C语言中没有string类型,用char[]来存储字符串,因此string类型对应的>、+、等操作不适用于char[]
2)C语言中的字符串,应使用<string.h>中的字符串处理函数,strlen、strcmp,strcat,strcpy等。
3) 可以用C语言中的字符串初始化string类型,但不可用string类型来初始化C语言中的字符串,除非使用c_str()
4.标准库类型vector
1)欲使用vector,应先包含头文件
2) 定义和初始化vector对象,应注意()和 {}的区别:
3)注意vector的resize()和reserve()的区别:
https://www.cnblogs.com/qlee/archive/2011/05/16/2048026.html
5.数组
1)不允许拷贝和赋值。不能将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值。
2)使用数组名字的时候,编译器一般会把它转换成指针,因此定义数组的时候必须指定数据类型,不允许用auto关键字由初始值的列表推断类型。:
3)C++11使用于数组的标准库函数begin()和end()
4)可以用数组初始化vector,但不可用vector初始化数组:
5)多维数组