You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
在 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 关键字 -
2147483647 之间的数字,而无符号的 int 型变量便能表示 04294967295 之间的数字。- 数据类型 -
- 7. 数据类型 -
7.1 数据类型与“模子”
7.2 变量的命名规则
- 8. void 关键字 -
1 -> 对函数返回的限定;
2 -> 对函数参数的限定。
8.1 void 修饰函数返回值和参数
在给函数不加返回值说明时默认为 int 型,所以对于没有返回值的函数推荐用 void 声明。另外,加上 void 类型声明后,也可以发挥代码的“自注释”作用。所谓的代码的“自注释”即代码能自己注释自己。
在 C 语言中,可以给无参数的函数传送任意类型的参数,但是在 C++编译器中编译同样的代码则会出错。所以,无论在 C 还是 C++中,若函数不接受任何参数,一定要指明参数为 void。
8.2 void 指针
按照 ANSI(American National Standards Institute)标准,不能对 void 指针进行算法操作,即下列操作都是不合法的:
但是大名鼎鼎的 GNU(GNU's Not Unix 的递归缩写)则不这么认定,它指定 void *的算法操作与 char *一致。因此下列语句在 GNU 编译器中皆正确:
因此,为了兼容两大标准, 高程序的可移植性,我们可以这样编写实现同样功能的代码:
典型的如内存操作函数 memcpy 和 memset 的函数原型分别为:
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 语言的独特见解,如有需要,欢迎购买实体书籍支持作者。
The text was updated successfully, but these errors were encountered: