C 基础语法
环境装好后,我们来系统过一遍 C 的基础语法。这一章不涉及复杂概念,只讲程序"长什么样"——结构、注释、分号、关键字、命名规则。读完你就能看懂任何 C 代码的大致框架。
1. C 程序的基本结构
一个能运行的 C 程序最少包含两部分:#include 预处理指令和 main 函数。看这个例子:
#include <stdio.h> // 预处理指令:引入标准输入输出库
#include <stdlib.h> // 引入标准库(malloc/rand 等)
int main(void) { // 主函数:程序入口
printf("Hello!\n"); // 函数调用语句
return 0; // 返回 0 表示正常结束
}
// 程序从 main 开始执行,执行完 main 就结束几个要点:
#include:预处理指令,把指定头文件的内容"复制粘贴"进来。stdio.h提供了printf、scanf等输入输出函数。int main:程序入口函数,操作系统调用它。返回int表示程序的退出状态(0 = 成功)。void:表示 main 不接收参数。如果要从命令行读参数,写int main(int argc, char *argv[])。return 0:返回 0 给操作系统,表示程序正常结束。非 0 通常表示出错。
2. 注释
注释是写给程序员看的,编译器会忽略。C 支持两种注释:
// 这是单行注释(C99 起支持),双斜杠开头到行尾
/* 这是多行注释,
可以跨越多行,
用斜杠星号包裹 */
/*
块注释常用于:
- 文件开头的版权与说明
- 函数的功能描述
- 临时禁用一大段代码
*/
/* 注意:块注释不能嵌套!
/* 这样嵌套会报错 */
因为第一个 */ 就结束了整个注释 */注意 C89 不支持单行注释 //,只能用 /* */;但 C99 之后两种都支持了,现在可以放心用 //。另外块注释不能嵌套,这是新手常踩的坑。
3. 分号与语句
C 和 Java/JS 一样每条语句以分号结尾,分号是语句的一部分。这条规则没有例外——少了分号编译器会报错。
// 每条语句必须以分号结尾
int a = 1; // 末尾的分号是语句的一部分
int b = 2;
int c = a + b;
// 一行可以写多条语句(但不推荐)
int x = 1; int y = 2;
// 一条语句也可以跨多行
int sum = a +
b +
c;
// 空语句:只有一个分号(有时用在空循环体)
while (getchar() != '\n')
; // 空语句,什么都不做4. 标识符命名规则
标识符是程序员自己起的名字(变量、函数、类型名)。C 的命名规则:
- 由字母、数字、下划线组成。
- 不能以数字开头。
- 区分大小写:
Age和age是两个不同的变量。 - 不能和关键字重名。
- 长度无硬性限制(编译器至少支持前 31 个字符有效)。
// 合法标识符:字母、数字、下划线,不能以数字开头
int age;
int _count;
int score2;
int MAX_SIZE; // 全大写常用于常量/宏
int calcSum(); // 驼峰或下划线都可以
// 非法标识符(会报错)
// int 2nd_place; // 不能以数字开头
// int my-score; // 不能有连字符
// int for; // 不能用关键字
// 区分大小写!
int Num = 10;
int num = 20; // Num 和 num 是两个不同的变量命名风格有两种主流约定:下划线(calc_sum,C/Linux 内核常用)和驼峰(calcSum,Java/JS 常用)。C 项目推荐下划线风格,保持和标准库一致。
5. C 的关键字
C 语言保留了一些词作为关键字,你不能用它们做标识符。C89 有 32 个关键字,比 Java(50)和 C++(90+)少:
// C89 的 32 个关键字(按字母序):
// auto break case char
// const continue default do
// double else enum extern
// float for goto if
// int long register return
// short signed sizeof static
// struct switch typedef union
// unsigned void volatile while
// C99 新增(5 个):
// _Bool _Complex _Imaginary inline restrict
// C11 新增(7 个):
// _Alignas _Alignof _Atomic _Generic
// _Noreturn _Static_assert _Thread_local
// 这些关键字不能用作变量名/函数名按用途分组记忆更容易:
- 数据类型:
charintshortlongfloatdoublevoidsignedunsigned_Bool - 控制流:
ifelseswitchcasedefaultforwhiledobreakcontinuereturngoto - 构造类型:
structunionenumtypedef - 存储类:
autostaticexternregister - 其他:
constvolatilesizeofinline
6. printf 格式化输出(重点)
printf 是 C 里最常用的函数,它通过占位符(format specifier)把变量插入字符串。占位符以 % 开头,不同类型用不同字母:
#include <stdio.h>
int main(void) {
int age = 20;
float pi = 3.14f;
char grade = 'A';
char name[] = "小明";
// 常用占位符
printf("整数: %d\n", age); // %d 整数
printf("浮点: %f\n", pi); // %f 浮点(默认 6 位小数)
printf("字符: %c\n", grade); // %c 单字符
printf("字符串: %s\n", name); // %s 字符串
printf("八进制: %o\n", 64); // %o 八进制
printf("十六进制:%x\n", 255); // %x 十六进制
printf("指针地址:%p\n", (void*)&age); // %p 指针
// 控制宽度和精度
printf("保留2位: %.2f\n", pi); // 3.14
printf("占8位: %8d\n", 42); // 42
printf("左对齐: %-8d|\n", 42); // 42 |
return 0;
}常用占位符速查:
%d/%i:有符号十进制整数%u:无符号整数;%ld:long;%lld:long long%f:浮点(默认 6 位小数);%lf:double%e:科学计数法;%g:智能选 %f 或 %e%c:单字符;%s:字符串%x/%X:十六进制(小写/大写);%o:八进制%p:指针地址(以十六进制输出)%%:输出字面的百分号本身
控制格式:%8d 占 8 位宽度右对齐,%-8d 左对齐,%.2f 保留 2 位小数,%08d 用 0 填充。
7. 空白符与代码风格
C 对待空白符(空格、Tab、换行)大部分情况下是不敏感的——你可以在任意位置加空格或换行。但有几点要注意:
- 标识符和关键字中间不能有空格(如
int x是声明,intx是另一个标识符)。 - 字符串字面量内部换行会出错(需要用换行转义字符或字符串拼接)。
- 缩进推荐用4 个空格(Linux 内核风格用 Tab,看你团队约定)。
C 没有 Go 的 gofmt 那种官方格式化工具,但有第三方的 clang-format,VS Code 装 plugin 后保存即可自动格式化,能统一团队风格。
小结
这一章你了解了 C 程序的整体骨架:include → main → return;知道了注释、分号、关键字、命名规则;记住了 printf 的常用占位符。下一篇我们看 C 的变量——这是装数据的基础。
← 上一篇 C 环境搭建
下一篇 C 变量 →