C++琐碎知识整理
二
1.C++与C一样,用终止符(terminator)将两条语句分开,终止符是一个分号,它是语句的结束标记,是语句的组成部分,而不是语句之间的标记,所以C++语句一定不能省略分号。
2.通常,main()被启动代码调用,而启动代码是由编译器添加到程序中的,是程序和操作系统之间的桥梁,该函数头描述的是main()和操作系统之间的接口。
3.在C语言中,省略返回类型相当于说类型是int,但在C++中淘汰了这种用法。main()函数返回类型是void的不是当前标准强制的一个选项,因此在有些系统上不能工作,应该避免这种格式。
4.如果编译器到达main()函数结尾时没有遇到返回语句,则认为结尾有return 0; 只适用于main()函数 可以看到普通的要求要返回的函数没有return的情况会有警告,但不会报错,而main函数可以没有return
5.C++风格的注释是两个正斜杠// ,而C风格的注释是 \ * * \ ,现在C++标准也在C语言中加了//注释
6.预处理器操作:在源代码被编译之前,替换或添加文本,#include这一行就是把iostream文件的内容替换这一行,因为这是一个预处理指令,并不是一个C++语句,所以不用分号作为结束。
7.C语言中头文件扩展名用.h,C++保留了这种用法。C++风格的头文件没有扩展名,有一些在C的基础上去掉.h,有些加上前缀c,表示来自C语言,比如 math.h -> cmath .
8.在C++中,没有.h的头文件可以包含名称空间,有.h就不行,例如
使用 iostream.h 和 cout 或者 使用iostream 和 std::cout
(我用iostream.h 和 cout 会报错,显示找不到iostream.h )
9.使用using编译指令使得名称空间的所有名称都可用,这是一种偷懒的做法,在大型项目中这是一个潜在的问题。最好是只使需要的名称可用。比如using std::cin;,对于简单程序来说无关紧要。
10.cout和cin都是一个预定义对象,可以智能识别并处理信息。
11.插入运算符<<将右侧的信息插入到流中,这是一个运算符重载的例子,<<也可表示位运算的左移运算符,编译器通过上下文来确定运算符的含义。
12.C语言本身也有一些运算符重载的情况,比如&表示取地址运算符,也可以表示按位与,*表示乘法,也表示间址访问。但是C语言不能用户自定义函数重载。
13.在C++中输出时另起一行用endl控制符,比如cout<<endl;这样的用法,在C中则是cout<<‘\n’;它们的区别是,endl会刷新缓冲区,将内容立即刷新输出,而’\n’则没有,这就是为什么用’\n’有时候原本应该先输出再输入,结果是先输入再输出,因为在你输入的时候输出的内容还留在输出缓冲区里没flush出来。用endl可以及时刷新现实,但是对于输出量大的情况,用endl频繁刷新会导致输出花费太多实践,因此用’\n’可以可以减少输出花费的时间,在比赛中常用这种技巧。
14.一行代码中不可分割的元素叫做标记(token),通常必须用空格,制表符或回车将两个标记分开。空格,制表符和回车统称为空白(white space).
15.声明语句:
int a;
这条语句提供了两项信息:1.需要的内存 2.该内存单元的名称。指出该程序需要足够的大小空间来存储一个整数,大小取决于实现。指出程序将使用a来标识存储在该内存单元中的值。
16.在C++中所有变量都必须声明,否则当使用时编译器将报错。
17.定义:程序中的声明语句叫做定义声明(defining declaration)语句,简称定义。声明不一定是定义。
18.在C中变量的声明都必须放在函数刚开始的位置,但C++中只要保证在声明后使用,且在同一个作用域里就行了。
19.C++和C有一项不寻常的特性–可以连续使用赋值运算符。
a=b=1;
从右向左进行,1被赋给b,b再赋给a
20.C++程序必须为程序中每个函数提供原型。函数原型只描述函数接口,描述的是发送给函数的信息和返回的信息。函数定义中包含了函数的编译代码。库文件包含了函数的编译代码,头文件包含了函数原型。
21.在创建变量时对它赋值,这个过程叫做初始化(initialization).
int a=1;
22.在有些语言中,又返回值的函数称为函数(function),没有返回值的函数称为过程(procedure)或子程序(subroutine)。但在C和C++中都称为函数。
23.C++不允许将函数定义嵌套在另一个函数定义里,每个函数定义都是独立的,所有函数的创建都是平等的。
23.可以认为,main()函数被操作系统调用,返回值通常也被叫做退出值,为0意味着程序运行成功,非0则意味着出现问题。
24.main不是关键字,但它是一个必不可少的函数名称,可以把main用作变量名,但有些时候会出错,因此最好不要这样做。
25.让程序能够访问名称空间std的方法有很多种,下面是常见的四种。
①将using namespace std;放到函数定义前面。
②将using namespace std;放到函数定义里,这样函数里就可以用std的函数了。
③用using std::cout这样的编译指令。
④完全不使用using,而在需要使用std中的元素的时候使用前缀std::
由图可知,这里的using作用域在main函数里
三
1.C++对于名称的长度没有限制,但有些平台有长度限制。与C(C99标准)不同的是,后者只保留名称中的前63个字符有意义。
2.C++确保了数据类型的最小长度,short至少是16位,int至少与short一样,long至少32位且至少与int一样,long long至少64位,且至少与long一样。
3.在美国基本字符集通常是ASCII和EBCDIC字符集,在使用这两种字符集的系统中,C++字节通常包含8位,而有些系统用更大的字符集,比如Unicode,因此有些实现有可能用16位或32位的字节。
4.对类型名用sizeof运算符时应将名称放在括号中,但对变量名使用sizeof时括号是可选的。
5.C++有一种C语言没有的初始化语法:
int a(123);
6.如果不对函数内部定义的变量初始化,该变量的值是不确定是,这意味着该变量的值是它被创建之前,相应内存单元保存的值。所以在声明变量时对它初始化,可避免以后忘记给他赋值的情况发生。
7.C++11中可以用统一的初始化方式:
int a={123};
等号也可以不用
int b{456};
大括号里也可以不包含任何东西,这时变量将被初始化为0
int c={};
int d{};
这有助于防范类型转换错误,是一种通用的初始化语法。
8.整形字面值是显示地书写的常量,C++用前一两位标识数字常量的基数。如果第一位位1-9则基数位10,如果第一位是0,第二位是1-7则基数为8,如果前两位为0x或0X则基数是16。默认情况下cout以十进制格式现实整数。
由图可知,实际上只要第一位是0,第二位是0-7,就会被当成是8进制。
9.char类型是另一种整型,虽然它最长用来处理字符,但也可以将它用做比short更小的整型。
10.当输入字符M时,cin将键盘输入的M转换成77,输出时,cout将值77转换成所显示的字符M,也就是说内存里存的其实是77这个数字,当输出时cout会自动识别到char类型,并输出77对应的字符。
11.通用字符名。用法类似转义字符,以\u或\U打头,\u后面是4个十六进制位,\U后面是8个十六进制位。表示字符的ISO 10646码点。
12.char也可以有符号和无符号,signed char范围从-128-127,unsigned char 范围从0-255
13.cin和cout将输入和输出看作是、char流,因此不适于用来处理wchar_t类型。iostream头文件的最新版本提供了作用相似的工具–wcin和wcout,用于处理wchar_t。可加上前缀L来指示宽字符常量和宽字符串
14.随着编程人员日益熟悉Unicode,类型wchar_t不能再满足需求,它的长度和符号随实现而异,因此C++11新增了类型char16_t和char32_t,都是无符号的,前者16位,后者32位,前缀u表示char16_t字符常量,前缀U表示char32_t字符常量.
15.const限定符。应该在声明中队const初始化,否则该常量的值是不确定的,且无法修改。
由图可知,不允许声明const时不初始化,不能对常量修改。
16.const比#define好:
? ①const可以明确指定类型
? ②const可以利用作用域将定义限制在特定的函数或文件中。编译器处理宏的时机是预处理阶段,编译器按文本顺序处理,遇到宏时就定义一个宏变量。#define是否生效取决于文本的顺序。 如图,#define放在了main之前的一个函数里,虽然没有调用func,但还是起作用了,而把#define放到main之后就不行了。
|