第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_LENGTHBUFFER_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);
重点:格式占位符的数量和类型,必须跟后面的变量一一对应。少一个、多一个、或者类型不匹配,轻则输出乱码,重则程序崩溃。我调试过最离谱的一个bug,就是printf里写了%d但传了个float进去,结果输出了一个天文数字。

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语言基础语法 注释 // 单行注释 /* 多行注释 */ 变量与常量 变量:值可变 常量:const 不可变 基本数据类型 int 整型 float 浮点型 char 字符型 输入输出函数 printf 输出 scanf 输入

这张图里,注释、变量与常量、基本数据类型、输入输出函数,就是本章的四大块。每一块都相互独立,但又共同构成了C语言程序的骨架。你学完这一章,应该能写出一个完整的、能跟用户交互的小程序了。

好了,这一章的内容就到这里。记住,多动手写代码,光看是学不会的。打开你的编译器,把上面的例子都敲一遍,改一改,看看输出会变成什么样。遇到问题别怕,调试本身就是最好的学习过程。


公众号:蓝海资料掘金营,微信deep3321