一、准备 Linux C语言环境
在 Linux 系统中我们需要确认是否已安装 gcc 编译器:
# 查看 gcc 版本
gcc -v
# CentOS 下通过 yum 安装 gcc 编译器
yum install gcc -y
# 安装 gdb 调试工具(非必需)
yum install gdb -y
# 安装 C 语言帮助手册(非必需)
yum install man-pages.noarch -y
# 可以通过 man 命令查看帮助手册,
# C 语言相关手册一般在第二章.
# 查看 open 函数的帮助手册
man 2 open
二、Hello World
1. 使用编辑器创建我们的第一个 C 程序文件:hello.c
#include <stdio.h>
int main()
{
/* 打印字符串 */
printf("Hello world!\n");
return 0;
}
- #include :预处理器指令,告诉编译器在实际编译之前要包含的文件。
- int main() :主函数,程序从这里开始执行。
- /* */ :注释,被编译器忽略的内容。
- printf() :打印函数,输出内容到标准输出。
- return :函数返回语句,即终止 main() 函数。
2. 编译并执行程序
# 使用 gcc 编译器编译 hello.c 文件
# 会生成一个默认的 a.out 可执行程序
gcc hello.c
# 执行 a.out 程序
./a.out
# 也可以编译后立即执行
gcc hello.c && ./a.out
# 编译多个文件并指定输出的程序名称
gcc test1.c test2.c -o main.out
# 执行 main.out 程序
./man.out
三、分隔符
分隔符用于分隔语句和表达式,常见的分隔符包括:
- 逗号(,):用于分隔变量声明或函数参数。
- 分号(;):用于结束语句。
- 圆括号(()):用于分组表达式、函数调用。
- 花括号({}):用于定义代码块。
- 方括号([]):用于数组下标。
四、两种注释方式
// 单行注释
/*
多行注释
多行注释
*/
五、标识符
标识符是程序中变量、函数、数组等的名字。标识符由字母(大写或小写)、数字和下划线组成,但第一个字符必须是字母或下划线,不能是数字。
标识符区分大小写,即 Liwy 与 liwy 是两个不同的标识符。
六、关键字
关键字为 C语言保留字,这些关键字不能作为标识符
- void :声明函数无返回值或无参数,声明无类型指针
- char :声明字符型变量或函数返回值类型
- int :声明整型变量或函数返回值类型
- float :声明浮点型变量或函数返回值类型
- double :声明双精度浮点型变量或函数返回值类型
- short :声明短整型变量或函数返回值类型
- long :声明长整型变量或函数返回值类型
- signed :声明有符号类型变量或函数返回值类型
- unsigned :声明无符号类型变量或函数返回值类型
- enum :声明枚举类型
- struct :声明结构体类型
- union :声明共用体类型
- const :声明常量,如果变量被 const 修饰,其值就不能再被改变
- volatile :声明变量在程序执行中可被隐含地改变
- auto :声明自动变量
- register :声明寄存器变量
- static :声明静态变量
- extern :声明变量或函数是在其它文件或本文件的其他位置定义
- if :条件语句
- else :条件语句否定分支
- switch :开关语句
- case :开关语句分支
- default :开关语句中的"其它"分支
- for :一种循环语句
- while :循环语句的循环条件
- do :循环语句的循环体
- break :跳出当前循环
- continue :结束当前循环,开始下一轮循环
- goto :跳转语句
- sizeof :计算数据类型或变量所占字节数
- typedef :用以给数据类型取别名
- return :子程序返回语句
C99 新增关键字
- _Bool :定义布尔类型变量
- _Complex :定义复数类型变量
- _Imaginary :定义虚数类型变量
- inline :定义内联函数
- restrict :告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容。
C11 新增关键字
- _Alignas :指定内存对齐方式
- _Alignof :获取类型的内存对齐方式
- _Atomic :定义原子类型变量,支持并发访问
- _Generic :根据参数类型选择不同的代码
- _Noreturn :告诉编译器函数不会返回
- _Static_assert :在编译时检查表达式的真假
- _Thread_local :定义线程局部变量,每个线程都有一份独立的副本