C++ Primer Notes —— 冷知识、易错、易忘、编程技巧、原理等(缓慢更新 21/11/24)

术语表

术语 解释
方法(method) 成员函数的同义术语
<< 输出运算符 将右对象的值写入左侧运算对象,返回值为左侧对象
>> 输入运算符 将左侧对象所指定的输入流读取数据,存入右侧运算对象中,返回值为左侧对象
bit byte word 一个二进制0或1为一位(bit) 一个字节(byte)为8位 ;一个字在不同的架构中字节数不一样,如MIPS为32位,则一字为4字节

基础

操纵符 manipulator P6

endl是一个操纵符,写入endl的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止的程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流。 调试语句等应保证“一直”刷新流,否则,若程序崩溃,输出可能留在缓冲区中,从而导致debug时的判断失误

嵌套注释 P8

/**/界定符对注释 不能嵌套 即

/*
*
*此处注释嵌套/**/会出错
*
*/

若需要对调试期间有可能嵌套注释的部分注释,最好的方式是使用单行注释注释掉每一行

///*
//*单行注释中的任何内容都会被忽略
//*
//*/

编译错误传递 P14

单个错误会导致传递效应,导致编译器在其后包含高比实际数量多发的多的错误信息。建议每修正一个错误后或最多修正了一小部分明显的错误后就重新编译,即"编辑编译调试"周期 (edit-complie-debug)

char与signed char ;float与double P31

整型分为两种:signed(省略)和unsigned
而字符型分为三种:char 、signed char 和unsigned char;char和signed char不一样,char实际上会表现为signed或unsigned其中一种,由编译器决定。所以,如果使用char进行运算特别容易出问题,如果需要一个不大的整数,需要决定signed或unsigned
使用double而不是float,因为其通常精确度不够,且double的计算代价与float相差无几,long double更是没有必要,且运行时消耗大。

类型转换

非bool转bool : 0=>false 其他=>true
bool转非bool : false=>0 其他=>1
超出范围的值赋给无符号类型: 值对区间取模后的余数 如

unsigned char a = -1 ; //a = 255

未定义超出范围的值赋给有符号类型: 未定义的(undefined),此时程序可能崩溃或继续工作或产生垃圾数据
注意:int的大小取决于系统环境 如int可能为32或64位。

列表初始化 P40

以下四条语句都可以用来初始化

int a = 0;
int a = {0};
int a{0};
int a(0);

其中带花括号的形式在c++11之后被全面应用,这种初始化形式有一个重要特点:若使用列表初始化且初始值存在丢失信息的风险,编译器将会报错。如

long double ld = 3.14159265358
int a{ld},b={ld}; //错误:转换未执行,因为存在丢失信息的危险
int c(ld),d = ld;//正确:执行,且丢失了部分值
上一篇:C语言-基本数据类型与位运算


下一篇:在n个任意不相同的数中,输出r个数的组合,并且n和r由键盘输入。