C语言关键字

关键字

变量类型关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
char val1 = 'a';        // 字符型变量

short int val2 = 100; // 短整型

int val3 = 100; // 整形

long int val4 = 100000; // 长整型

float val5 = 100.1f; // 单浮点型

double val6 = 100.1; // 双浮点型

signed int val7 = -100; // 修饰字符型、短整形、整形和长整形,代表有正负符号,可以保存正负数

unsigned int val8 = 100;// 修饰字符型、短整形、整形和长整形,代表无正负符号,只可以保存正数和0

// void用于修饰函数的参数类型及返回值
// 代表不需要传入参数,没有返回值
void test(void) {

}

  C99新增定义bool类型关键字_Bool_Bool只有01两个值,如果给他赋非零值,它的值仍然是1

1
2
3
4
5
6
7
_Bool b1 = 1;
_Bool b2 = 0;
_Bool b3 = 100;
_Bool b4 = NULL;

// 将输出 1 0 1 0
printf("b1 = %d,b2 = %d,b3 = %d,b4 = %d", b1, b2, b3, b4);

  在库文件stdbool.h中,有_Bool的宏定义bool0的宏定义false1的宏定义true,引入该库文件后,可以以如下形式定义bool类型变量

1
2
bool b1 = false;
bool b2 = true;

  当使用printf输出不同类型的字符时,需要使用以下占位符将对应类型的字符进行格式化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
%d   // 十进制有符号整数
%u // 十进制无符号整数
%x // 以十六进制表示的整数
%o // 以八进制表示的整数
%ld // 十进制长整型
%hd // 十进制短整形
%f // float类型浮点数
%lf // double类型浮点数
%e // 指数形式的浮点数
%g // 以 %e 或 %f 中较短的形式输出浮点数
%s // 字符串
%ls // 宽字符串
%c // 单个字符
%lc // 宽字符
%p // 指针

%% // 输出百分号 %
%+ // 强制输出带有符号数的正负号
%- // 左对齐输出

%Nd // 输出宽度为 N 位的有符号整数,不足 N 位前面使用空格补齐
%.Nf // 输出浮点数,保留 N 位小数
%0 // 数字前面用 0 补齐
%3d // 要求宽度为 3 位,如果不足 3 位,前面空格补齐
%03d // 要求宽度为 3 位,如果不足 3 位,前面 0 补齐
%-3d // 要求宽度为3位,如果不足3位,后面空格补齐
%.2f // 小数点后保留两位

储存类型关键字

  register修饰的变量称为寄存器变量,系统会尽量(不一定)将其储存空间存放在寄存器中,当变量中的数据被成功存放在寄存器中之后,就没有了内存地址,CPU取寄存器中的数据会快于内存中的数据,但register不能修饰数组,只能修饰字符型、短整形、整形及长整型变量

1
2
// register声明寄存器变量
register int val1 = 100;

  static可以修饰全局变量、局部变量以及函数

1
2
// static修饰静态变量
static int val2 = 100;

  const修饰的变量称为常量,常量值一旦被定义就无法修改,相当于java中的final

1
2
// const修饰常量
const int val3 = 100;

  auto用于声明自动变量,自动变量通常是局部变量(函数的形参也视为局部变量),局部变量在不加任何修饰的情况下默认就是自动变量。所以auto可有可无了,修饰和不修饰一样

1
2
// 没什么用,加和不加一样
auto int val4 = 200;

  extern修饰外部变量或函数、引用外部变量或函数,extern修饰的变量或函数表示可以被外部调用,由于函数和变量默认可被外部调用,所以作为修饰关键字时extern是可以不添加的,但是当引用外部变量或函数时,必须使用extern对其声明

1
2
3
4
5
6
7
8
9
10
extern void test(); // 引用外部函数
extern int val1; // 引用外部变量

int main() {
// 引用外部函数
test();

// 引用外部变量
printf("外部变量 = %d\n",val1);
}

控制语句关键字

if else for while do switch case break continue goto default

  其中goto直接跳转到目标标签所在的位置向下执行,如下代码将会输出125;其它的不说了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main() {

printf("1");
printf("2");

goto tmp; // 将会跳转到tmp标签所在的位置向下执行

printf("3");
printf("4");

tmp: // tmp标签

printf("5");

return 0;
}

其他关键字

  sizeofsizeof()函数用于获取括号中的表达式占用储存空间的大小,表达式在这里可以是变量、常量、数组、指针等,sizeof的返回值是size_t类型的无符号整数,单位是字节;size_t虽然在许多情况下被广泛使用,但并不是关键字,而是一个预定义的类型名,其占位符是%zu%zd

1
2
int a = 1;
printf("size = %zu", sizeof(a));

  typedef用于给已有数据类型起别名,使用别名定义的变量与原数据类型定义的变量没有任何类型上的差异

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
typedef int NEW_INT;        // 给int类型定义别名为NEW_INT
NEW_INT val1 = 111; // 使用别名定义变量
printf("val1 = %d\n", val1);// 输出别名定义的变量

typedef short int INT16; // 给short int类型定义别名为INT16
INT16 val2 = 10; // 使用别名定义变量
printf("val2 = %d\n", val2);// 输出别名定义的变量

typedef int FIVE_INT[5]; // 给固定长度为 5 的 int 类型数组起别名
FIVE_INT fiveInt = { 1,2,3,4,5 }; // 使用别名定义数组

typedef int INT_ARR[]; // 给未固定长度的 int 类型数组起别名
INT_ARR ints = { 1,2,3,4,5,6,7 }; // 使用别名定义数组

typedef void(*FUNC_POINTER)(int); // 给返回值为 void 形参为一个 int 的函数指针起别名
FUNC_POINTER funcPointer = &func; // 使用别名定义函数指针

typedef int(*ARR_POINTER)[4]; // 给 4 列的 int 型二维数组起别名
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}};
ARR_POINTER arrPointer = arr; // 使用别名定义二维数组的数组指针

  volatile修饰的变量每次使用时都去内存中取最新的值,而不是寄存器中的备份

1
volatide int val1 = 11;

类型转换

自动转换

  字节数低的类型转字节数高的类型,会进行自动类型转换

强制转换

  字节数高的类型转字节数低的类型,需要进行强制类型转换;如下将float类型强制转换成int类型,输出结果为2

1
2
3
4
float val1 = 2.5f;
int val2 = (int)val1;

printf("val2 = %d", val2);