在 C++里 struct 关键字与 class 关键字一般可以通用,只有一个很小的区别。struct 的成员默认情况下属性是 public 的,而 class 成员却是 private 的。很多人觉得不好记,其实很容易。你平时用结构体时用 public 修饰它的成员了吗?既然 struct 关键字与 class 关键字可以通用,你也不要认为结构体内不能放函数了。
- 10. union 关键字 -
union 关键字的用法与 struct 的用法非常类似,用来维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间。例子如下:
union StateMachine
{
char character;
int number;
char *str;
double exp;
};
一个 union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,最大长度是 double 型态,所以 StateMachine 的空间大小就是 double 数据类型的大小。
编译器在编译时会对代码进行优化。而因为在(1)、(2)两条语句中 i 没有被用作左值,这时候编译器认为 i 的值没有发生改变,所以在(1)语句时从内存中取出 i 的值赋给 j 之后,这个值并没有被丢掉,而是在(2)语句时继续用这个值给 k 赋值。编译器不会生成出汇编代码重新从内存里取 i 的值,这样提高了效率。但要注意:(1)、(2)语句之间 i 没有被用作左值才行。
18.2 volatile 关键字防止编译器优化
volatile int i=10;
int j = i; // (3)语句
int k = i; // (4)语句
如果将之前的代码改成上面的样子的话,volatile 关键字会告诉编译器 i 是随时可能发生变化的,每次使用它的时候必须从内存中取出 i的值,因而编译器生成的汇编代码会重新从 i 的地址处读取数据放在 k 中。
- 19. return 关键字 -
return 用来终止一个函数并返回其后面跟着的值。
return 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。
关于 int main 中该不该出现 return 0; 又为什么是这样,我在我的博客园中如是写道:
C 语言标准定义的 32 个关键字有什么,分别怎么用,用的时候需要注意到什么,便是这篇文章所要告诉的一切。内容较长,先上本篇文章结构思维导图。文章结尾处有 32 个关键字附录。
- 修饰类 -
- 1. extern -- 最会带帽子的关键字 -
- 2. auto -
- 3. register -- 最快的关键字 -
3.1 寄存器
3.2 使用 register 修饰符的注意点
- 4. static -- 最名不符实的关键字 -
关键字 static 有着不寻常的历史。起初,在 C 中引入关键字 static 是为了表示退出一个块后仍然存在的局部变量。随后,static 在 C 中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用 static 关键字来表示这第二种含义。
4.1 修饰变量
4.2 修饰函数
- 5. const 关键字 -
5.1 const 修饰的只读变量
5.2 节省空间,避免不必要的内存分配,同时 高效率
5.3 修饰一般变量
5.4 修饰数组
5.5 修饰指针
5.6 修饰函数的参数
5.7 修饰函数的返回值
- 6. signed、unsigned 关键字 -
- 数据类型 -
- 7. 数据类型 -
7.1 数据类型与“模子”
7.2 变量的命名规则
- 8. void 关键字 -
8.1 void 修饰函数返回值和参数
8.2 void 指针
但是大名鼎鼎的 GNU(GNU's Not Unix 的递归缩写)则不这么认定,它指定 void 的算法操作与 char 一致。因此下列语句在 GNU 编译器中皆正确:
因此,为了兼容两大标准, 高程序的可移植性,我们可以这样编写实现同样功能的代码:
8.3 void 不能代表一个真实的变量
- 9. struct 关键字 -
9.1 空结构体有多大
9.2 柔性数组
9.3 struct 和 class 的区别
- 10. union 关键字 -
10.1 大小端模式对 union 类型数据的影响
- 11. enum 关键字 -
11.1 枚举类型的使用方法
11.2 枚举与 #define 宏的区别
- 选择分支 -
- 12. If else 组合 -
12.1 bool 变量与“零值”进行比较
12.2 float 变量与“零值”进行比较
12.3 指针变量与“零值”进行比较
12.4 else 到底与哪个 if 配对呢?
12.5 if 语句后面的分号
- 13. switch case 关键字 -
13.1 case 关键字后面的值的要求
13.2 case语句的排列顺序
13.3 使用 case 语句的其他注意事项
- 14. goto 关键字 -
- 循环分支 -
- 15. do while for 关键字 -
15.1 break 与 continue 的区别
15.2 循环语句的注意点
- 其他 -
- 16. sizeof -- 最冤枉的关键字 -
很多人都认为 sizeof 是函数,至少我第一次学 C 语言的时候是这么认为的。然而事实呢? sizeof 是关键字,常年被人误认为函数的关键字。
sizeof 在计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。
一般情况下,sizeof 关键字后尽可能加上括号,继续装作函数。
- 17. typedef -- 伟大的缝纫师 -
17.1 历史的误会----也许应该是 typerename
17.2 typedef 与#define 的区别
从这段代码可以看出 typedef 取的别名不支持这种类型扩展。
从这段代码又可以看出 #define 仅仅是简单的替换,并无法代表一个数据类型。
- 18. volatile -- 最易变的关键字 -
18.1 编译器优化
18.2 volatile 关键字防止编译器优化
- 19. return 关键字 -
附录:C 语言标准定义的 32 个关键字
写在最后
这篇文章灵感和素材均来源自《C 语言深度解剖》这本书,感谢作者对 C 语言的独特见解,如有需要,欢迎购买实体书籍支持作者。