第2章:C语言基础语法——注释、变量与常量、基本数据类型、输入输出
各位同学,欢迎来到第二章。说实话,这一章的内容是C语言的“地基”。你想想看,盖房子如果地基没打好,后面装修得再漂亮也白搭。我见过太多初学者,一上来就急着写复杂逻辑,结果连个变量类型都搞混,调试起来那叫一个痛苦。
今天咱们就把这几个最基础的东西彻底讲透。别嫌简单,基础越扎实,后面学指针、结构体的时候你就越轻松。
2.1 注释——代码里的“便签纸”
注释这东西,说白了就是写给程序员自己看的。编译器会直接忽略它,不产生任何机器码。但它的重要性,我敢说,不亚于代码本身。
我在项目中遇到过最头疼的事,就是接手一段没有注释的代码。几百行下来,每个变量名都是a、b、c,循环嵌套了五六层……嗯,那种感觉就像在玩密室逃脱,还没地图。
2.1.1 单行注释
用两个斜杠 // 开头,后面跟注释内容。只对本行有效。
// 这是我写的第一个C程序
printf("Hello, World!\n"); // 在屏幕上打印一句话
2.1.2 多行注释
用 /* 开头,*/ 结尾。中间可以跨多行。我个人习惯用这个来注释掉一大段调试代码。
/*
* 函数功能:计算两个整数的和
* 参数:a - 第一个整数
* b - 第二个整数
* 返回值:两数之和
*/
int add(int a, int b) {
return a + b;
}
/* /* 内部注释 */ */ 会出错。我曾经因为这个bug排查了半小时,最后发现是注释嵌套导致的编译错误。
2.2 变量与常量——数据的“容器”
程序要处理数据,数据就得有个地方放。变量和常量就是干这个的。
2.2.1 变量
变量,顾名思义,它的值可以变。你可以在程序运行过程中反复修改它。定义变量时,需要先指定数据类型,再给变量起个名字。
int age; // 定义一个整型变量,名字叫age
age = 25; // 把25这个值放进去
age = 30; // 再改成30,没问题
变量命名有规则:只能包含字母、数字和下划线,不能以数字开头。我建议你用有意义的英文单词,别用拼音,更别用a1、b2这种。你想想看,三个月后你自己回来看代码,能记得a1是啥意思吗?
2.2.2 常量
常量就是固定不变的值。一旦定义好,程序里就不能改了。C语言里用 const 关键字来定义常量。
const double PI = 3.14159; // 圆周率,谁也别想改它
const int MAX_SIZE = 1024; // 最大缓冲区大小
MAX_LENGTH、BUFFER_SIZE。
2.3 基本数据类型——int、float、char
C语言提供了几种基本数据类型,用来描述不同种类的数据。我刚开始学的时候,总觉得类型好多记不住。其实你只要抓住核心:数据是什么,就用什么类型。
| 类型 | 关键字 | 占用字节 | 取值范围(32位系统) | 示例 |
|---|---|---|---|---|
| 整型 | int | 4 | -2^31 ~ 2^31-1 | 100, -50, 0 |
| 单精度浮点型 | float | 4 | 约 ±3.4e-38 ~ ±3.4e38 | 3.14, -0.001 |
| 字符型 | char | 1 | -128 ~ 127 或 0 ~ 255 | 'A', '9', '\n' |
这里有个坑,我必须要说。float类型在内存里是近似存储的,不是精确值。比如0.1这个数,在float里其实存的是0.100000001490116……所以千万别用 == 直接比较两个浮点数是否相等。我曾经在嵌入式项目里吃过这个亏,一个温度传感器读数死活对不上,最后发现是浮点数比较的问题。
2.3.1 整型 int
int用来存整数。日常开发中,计数器、索引、状态码,基本都是int。如果你确定数值不会为负,可以用 unsigned int,取值范围能翻一倍。
int count = 10;
unsigned int positive = 1000;
2.3.2 浮点型 float
float用来存带小数点的数。比如温度、电压、百分比。精度大约6-7位有效数字。如果需要更高精度,用 double,它占8个字节,精度更高。
float temperature = 36.5;
double precise_value = 3.14159265358979;
2.3.3 字符型 char
char用来存单个字符。注意,字符要用单引号括起来。比如 'A'、'0'、'\n'。每个字符对应一个ASCII码值,所以char本质上也是一个整数。
char grade = 'A';
char newline = '\n'; // 换行符
2.4 printf输出函数——让程序“说话”
printf是C语言最常用的输出函数。它的作用就是把数据格式化后打印到屏幕上。说白了,就是让程序跟你对话。
2.4.1 基本用法
printf("Hello, World!\n"); // 打印字符串,\n表示换行
2.4.2 格式化输出
printf支持用格式占位符来输出变量。常用的有:
%d—— 输出int类型%f—— 输出float类型%c—— 输出char类型%s—— 输出字符串
int age = 25;
float height = 1.75;
char initial = 'Z';
printf("年龄:%d\n", age);
printf("身高:%.2f 米\n", height); // .2f 表示保留两位小数
printf("名字首字母:%c\n", initial);
2.5 scanf输入函数——让程序“听”你说话
scanf是printf的“好兄弟”。它从键盘读取用户输入,然后存到变量里。注意,scanf需要你提供变量的地址,也就是在变量名前加个 & 符号。
2.5.1 基本用法
int num;
printf("请输入一个整数:");
scanf("%d", &num); // 注意 & 符号
printf("你输入的是:%d\n", num);
2.5.2 常见问题
scanf有个让人头疼的地方:它会忽略空白字符(空格、换行、制表符)。但如果你输入的是字符,它会把换行符也读进去。我曾经在写菜单程序时,用户输入完数字按回车,结果下一个scanf直接读到了换行符,程序就跳过了输入……
解决办法很简单:在%c前面加个空格,让scanf跳过空白字符。
char ch;
printf("请输入一个字符:");
scanf(" %c", &ch); // 注意 %c 前面有个空格
2.6 本章知识体系
下面这张图,把本章的核心知识点串起来了。你可以把它当成一张“地图”,学完一章后对照着回顾一下。
这张图里,注释、变量与常量、基本数据类型、输入输出函数,就是本章的四大块。每一块都相互独立,但又共同构成了C语言程序的骨架。你学完这一章,应该能写出一个完整的、能跟用户交互的小程序了。
好了,这一章的内容就到这里。记住,多动手写代码,光看是学不会的。打开你的编译器,把上面的例子都敲一遍,改一改,看看输出会变成什么样。遇到问题别怕,调试本身就是最好的学习过程。
公众号:蓝海资料掘金营,微信deep3321