其它关键字

const

  • 作用const 用于声明常量,表示变量的值不可被修改。
  • 示例
1
2
const int age = 30; // 定义一个不可修改的整数常量
age = 35; // 这里会导致编译错误,因为常量不可被修改

sizeof

  • 作用sizeof 用于获取数据类型或变量占用的内存字节数。
  • 示例
1
2
3
int x = 10;
size_t size = sizeof(x); // 获取整数变量 x 占用的字节数
printf("x 占用的字节数为: %zu\n", size);

typedef

  • 作用typedef 用于创建自定义数据类型的别名。
  • 示例
1
2
typedef int Age; // 创建一个名为 Age 的整数别名
Age myAge = 25; // 使用 Age 别名定义整数变量
  • 另一个示例:
1
2
3
4
5
6
7
8
typedef struct {
int x;
int y;
} Point;

Point p;
p.x = 5;
// 使用自定义的数据类型别名 Point 来声明变量

volatile

  • 作用volatile 用于告诉编译器该变量的值可能在编译器控制之外的情况下发生变化(被修改),因此不应进行优化。
  • 示例
1
2
3
4
5
volatile int sensorValue; // 定义一个用于传感器值的变量
while (1) {
int reading = sensorValue; // 读取传感器值
// 这里编译器不会对 reading 进行优化,以确保每次都读取最新值
}

何为“不应进行优化?”

具体来说,不进行优化意味着编译器不会对这些变量的读取和写入操作进行任何形式的优化,以确保它们在程序中的每次引用都反映其实际状态,而不会被优化掉或重排序。

通常情况下,volatile 用于描述那些可能被外部因素更改的变量,如硬件寄存器多线程程序中的共享变量

这些变量可能在程序之外的上下文中被更改,例如硬件设备可能会更新某个寄存器的值,或者在多线程环境中,一个线程可能会更改另一个线程正在访问的共享变量。

因此,编译器不能对这些变量的操作进行优化,以确保程序的行为是可预测的。

1
2
3
4
5
6
7
volatile int sensorValue; // 定义一个用于传感器值的 volatile 变量

while (1) {
int reading = sensorValue; // 读取传感器值
// 编译器不会优化这里的 reading,以确保每次都读取最新的传感器值
// 这是因为 sensorValue 可能在程序之外的上下文中被更改
}

如果不将 sensorValue变量声明为 volatile,编译器可能会认为 reading 的值在循环中不会改变,从而进行优化,导致不正确的行为。

总之,volatile 关键字用于告诉编译器不要对其修饰的变量进行任何优化,以确保这些变量的值在程序中的每次引用都是最新的。

goto

  • 作用goto 用于实现无条件跳转到程序中的标签位置,但通常不推荐使用(goto语句的随性跳转会极大的降低代码可读性,对维护不利,且可能造成逻辑混乱)。
  • 示例
1
2
3
4
5
6
7
8
9
for (int i = 1; i <= 10; i++) {
if (i == 5) {
goto jump_here; // 无条件跳转到标签位置
}
printf("%d\n", i);
}

jump_here: // 标签位置
printf("Jumped here!\n");

总结

一般来说,应该尽量避免使用 goto,因为它可以导致代码难以理解和维护

初学者通常不需要使用 volatile,而应当谨慎使用 typedef

constsizeof` 是C语言中非常常见和有用的关键字