3. C语言基础语法
各位同学,欢迎来到第三章。从这一章开始,我们正式动手写代码。
说实话,很多初学者觉得语法枯燥。但我告诉你,语法就是你和计算机沟通的「暗号」。你写对了,它听你的;写错了,它罢工给你看。我在项目里见过太多因为少写一个分号、搞错数据类型导致的线上事故。嗯,咱们今天就把这些基本功打扎实。
3.1 注释:给代码加个「说明书」
注释是写给人看的,不是给机器看的。编译器会直接忽略它。
我个人习惯,在写复杂逻辑之前,先把注释写好。就像画图纸一样,先搭框架再填细节。
C语言有两种注释方式:
- 单行注释:
// 这是单行注释,从双斜杠开始到行尾结束。 - 多行注释:
/* 这是多行注释 */,可以跨越多行。
#include <stdio.h>
int main() {
// 单行注释:下面这行代码打印问候语
printf("Hello, World!\n");
/*
多行注释:
这里可以写一大段说明。
比如解释这个函数的作用。
*/
return 0;
}
我的小建议:注释要「说人话」。别写「i++ 表示 i 自增1」这种废话。要写「这里循环遍历用户输入的数组,查找最大值」。我曾经接手过一个项目,注释全是拼音缩写,看得我头皮发麻。
3.2 变量:给数据起个名字
变量,说白了就是一块内存空间,我们给它贴了个标签。你可以往里面存数据,也可以随时取出来用。
变量声明的基本格式:
数据类型 变量名;
比如:
int age; // 声明一个整型变量,名叫 age
float price; // 声明一个浮点型变量,名叫 price
char grade; // 声明一个字符型变量,名叫 grade
变量命名规则(踩坑总结):
- 只能包含字母、数字、下划线。
- 不能以数字开头。
- 不能是C语言的关键字(比如
int、if、return这些)。 - 区分大小写:
Age和age是两个不同的变量。
我曾经犯过的错:有一次我用了 int 1st_number;,编译器直接报错。你想想看,变量名以数字开头,编译器根本不知道这是变量名还是数字字面量。记住:字母或下划线开头,准没错。
3.3 常量:固定不变的值
常量就是程序运行过程中不能改变的值。比如圆周率 π,你总不能今天3.14,明天3.15吧?
定义常量的两种方式:
- 使用
#define宏定义(预处理阶段替换) - 使用
const关键字(编译阶段检查)
#include <stdio.h>
#define PI 3.14159 // 宏定义常量,没有分号
const int MAX_SIZE = 100; // const 常量,有分号
int main() {
printf("圆周率 PI = %f\n", PI);
printf("最大容量 MAX_SIZE = %d\n", MAX_SIZE);
// PI = 3.14; // 错误!不能修改常量
return 0;
}
我个人更推荐用 const:因为 const 有类型检查,编译器能帮你发现错误。而 #define 只是简单的文本替换,有时候会引发一些奇怪的 bug。我在一个嵌入式项目里就吃过这个亏——宏定义替换后,表达式优先级搞错了,查了一下午。
3.4 基本数据类型:int、float、char
C语言的数据类型,说白了就是告诉编译器:这块内存我要怎么用,占多大地方。
| 数据类型 | 关键字 | 占用空间 | 取值范围(32位系统) | 示例 |
|---|---|---|---|---|
| 整型 | int |
4字节 | -2,147,483,648 ~ 2,147,483,647 | int a = 10; |
| 单精度浮点型 | float |
4字节 | 约 ±3.4e-38 ~ ±3.4e+38 | float b = 3.14f; |
| 字符型 | char |
1字节 | -128 ~ 127 或 0 ~ 255 | char c = 'A'; |
几个容易忽略的点:
float字面量后面加f,比如3.14f。不加的话,默认是double类型。char本质上是一个小整数。你可以用char ch = 65;,它和char ch = 'A';是一样的。因为 ASCII 码中 'A' 就是 65。int的大小取决于平台。在16位系统上是2字节,在32/64位系统上是4字节。写跨平台代码时要小心。
3.5 printf 与 scanf:和程序「对话」
这两个函数是C语言最基础的输入输出工具。说白了,printf 是让程序说话,scanf 是让程序听你说话。
3.5.1 printf:格式化输出
基本格式:
printf("格式控制字符串", 输出列表);
格式控制字符串里用 格式占位符 来占位置,后面再填实际的值。
| 占位符 | 对应数据类型 | 示例 |
|---|---|---|
%d |
int |
printf("%d", 10); |
%f |
float / double |
printf("%f", 3.14); |
%c |
char |
printf("%c", 'A'); |
%s |
字符串 | printf("%s", "hello"); |
#include <stdio.h>
int main() {
int age = 25;
float height = 1.75f;
char grade = 'A';
printf("年龄:%d 岁\n", age);
printf("身高:%.2f 米\n", height); // %.2f 保留两位小数
printf("成绩等级:%c\n", grade);
return 0;
}
3.5.2 scanf:格式化输入
scanf 用来从键盘读取数据。注意:变量前面要加 & 取地址符。这是初学者最容易忘的。
基本格式:
scanf("格式控制字符串", &变量1, &变量2, ...);
#include <stdio.h>
int main() {
int num;
float price;
char ch;
printf("请输入一个整数:");
scanf("%d", &num); // 注意 & 符号
printf("请输入一个浮点数:");
scanf("%f", &price);
printf("请输入一个字符:");
scanf(" %c", &ch); // %c 前面加空格,吃掉之前的换行符
printf("你输入了:%d, %.2f, %c\n", num, price, ch);
return 0;
}
我曾经踩过的坑:
- 忘记加
&:程序直接崩溃。因为scanf需要知道变量的地址才能把值写进去。 - 输入格式不匹配:比如你写
scanf("%d", &num);但用户输入了字母,程序会直接跳过,变量保持原值。而且输入缓冲区会残留数据,导致后续scanf全部失效。 - %c 前面的空格:如果不加空格,
scanf会读取上一次输入留下的换行符\n,而不是你想要的字符。这个小问题当年让我调试了半小时。
3.6 知识体系总览
下面这张图,帮你把本章的知识点串起来。你看一遍,心里就有谱了。
总结一下:这一章的内容,说白了就是三件事——怎么存数据(变量/常量/数据类型)、怎么输出数据(printf)、怎么输入数据(scanf)。把这些搞明白,你已经能写一些简单的交互程序了。
嗯,我当年学到这里的时候,写了一个「计算器」程序,虽然只能算加减法,但那种成就感至今难忘。你也试试看?