变量和类型
程序要记住一些数:考试的分数、商品的价格、仓库里的库存。变量就是一个有名字的格子,里面放一个值。在 C 里,用变量之前要先说清楚两件事:它叫什么,放的是哪种值。
1#include <stdio.h>2 3int main(void) {4 int score = 90;5 printf("分数:%d\n", score);6 return 0;7}
分数:90
int score = 90; 的意思是:要一个放整数(int)的格子,名字叫 score,先放进 90。printf 里的 %d 是个占位的记号,显示的时候换成逗号后面 score 的值。
声明和赋值
int stock; 是声明变量:告诉编译器有这么一个变量,它放整数。stock = 12; 是赋值:往格子里放一个值。这两步可以分开写,也可以像上面那样合成一行。变量要先声明,后面的语句才能用它。
1#include <stdio.h>2 3int main(void) {4 int stock;5 stock = 12;6 printf("库存:%d\n", stock);7 stock = 7;8 printf("库存:%d\n", stock);9 return 0;10}
库存:12 库存:7
赋值可以做很多次,新值会换掉旧值。C 里的 = 不是「等于」,而是「把右边的值放进左边的变量」。点单步,看 stock 怎么从 12 变成 7。
这段程序显示什么?
1#include <stdio.h>2 3int main(void) {4 int a = 5;5 int b = a;6 a = 9;7 printf("%d\n", b);8 return 0;9}
int b = a; 把 a 当时的值 5 抄了一份放进 b。后来 a 换成 9,b 里的 5 不会跟着变。
三种基本类型
C 的每个变量都有固定的类型,声明时写在名字前面,以后不能改。先认识最常用的三种:
| 类型 | 放什么 | 例子 | printf 用 |
|---|---|---|---|
int | 整数 | 90、-3、0 | %d |
double | 带小数点的数 | 4.5、-0.25 | %f |
char | 一个字符,写在单引号里 | 'A'、'7'、'?' | %c |
1#include <stdio.h>2 3int main(void) {4 int count = 3;5 double price = 4.5;6 char grade = 'A';7 printf("数量:%d\n", count);8 printf("价格:%f\n", price);9 printf("等级:%c\n", grade);10 return 0;11}
数量:3 价格:4.500000 等级:A
%f 默认显示 6 位小数,所以 4.5 显示成 4.500000。只显示两位怎么写,第 3 课讲。char 一次只放一个英文字母、数字或符号;汉字一个 char 放不下,第 13 课再讲为什么。
把带小数的数放进 int 会怎样?
这段程序显示什么?
1#include <stdio.h>2 3int main(void) {4 int people = 3.9;5 printf("%d\n", people);6 return 0;7}
int 只能放整数。把 3.9 放进去时,小数部分直接丢掉,不会四舍五入,所以是 3。
一个 printf 显示几个值
一个 printf 里可以有好几个格式符,后面的值用逗号隔开,按顺序一个对一个:
1#include <stdio.h>2 3int main(void) {4 int day = 3;5 int steps = 8500;6 double temp = 21.5;7 printf("第 %d 天:走了 %d 步,气温 %f 度\n", day, steps, temp);8 return 0;9}
第 3 天:走了 8500 步,气温 21.500000 度
第一个 %d 换成 day,第二个 %d 换成 steps,%f 换成 temp。格式符要和值的类型对上:%d 配 int,%f 配 double,%c 配 char。对不上的话,显示出来的是乱的,编译器通常会给一条警告。
先赋值,再使用
声明了变量却没给它值,格子里是什么?C 不管:里面可能是任何数,这次和下次还可能不一样。用这样的值是未定义行为。在普通的电脑上,程序会照样跑下去,显示一个莫名其妙的数。我们的引擎会停在出事的那一行,告诉你是哪个变量:
1#include <stdio.h>2 3int main(void) {4 int total;5 printf("总数:%d\n", total);6 return 0;7}
use of uninitialized value发生了什么: 停在第 5 行:「total」还没有赋值就被用了。真 C 里这会是一个乱数(每次运行都可能不一样)。
改法很简单:声明的时候就给它一个值,比如 int total = 0;。
小技巧: 声明变量时顺手给它一个值,就不会犯这个错。
sizeof:占多大地方
每种类型的值在内存里占固定的字节数。sizeof 告诉你是几个字节,可以写类型,也可以写变量。它的结果用 %zu 显示:
1#include <stdio.h>2 3int main(void) {4 int score = 90;5 printf("int:%zu 字节\n", sizeof(int));6 printf("double:%zu 字节\n", sizeof(double));7 printf("char:%zu 字节\n", sizeof(char));8 printf("score:%zu 字节\n", sizeof score);9 return 0;10}
int:4 字节 double:8 字节 char:1 字节 score:4 字节
char 永远是 1 个字节。int 和 double 的大小在不同的电脑上可以不一样,不过现在常见的电脑上就是 4 和 8。字节数决定了能放多大的数:4 个字节的 int 最多大约 21 亿,第 4 课会看到超过了会怎样。
常量 const
有些值定下来就不该再变,比如一周的天数。声明时在前面加 const,它就成了常量;以后谁想改它,编译器都不答应:
1#include <stdio.h>2 3int main(void) {4 const int DAYS_IN_WEEK = 7;5 printf("一周有 %d 天\n", DAYS_IN_WEEK);6 DAYS_IN_WEEK = 8;7 return 0;8}
main.c: In function 'main':
main.c:6:18: error: assignment of read-only variable 'DAYS_IN_WEEK'
6 | DAYS_IN_WEEK = 8;
| ^read-only variable 是「只读的变量」:只能读,不能改。常量通常用大写字母和下划线起名,一眼就能和普通变量分开。去掉最后那次赋值,程序就能运行了。
起名的规矩
变量名由字母、数字和下划线 _ 组成,还有几条规矩:
| 规矩 | 可以 | 不行 |
|---|---|---|
只用字母、数字和 _ | total_price | total-price |
| 不能以数字开头 | day2 | 2day |
| 不能有空格 | max_score | max score |
| 不能用 C 自己的词 | count | int |
另外,大写和小写是不同的字母,score 和 Score 是两个变量:
1#include <stdio.h>2 3int main(void) {4 int score = 90;5 int Score = 60;6 printf("%d 和 %d\n", score, Score);7 return 0;8}
90 和 60
能这么写,不代表应该这么写:两个名字只差大小写,很容易看错。习惯上用小写字母,单词之间用下划线,名字说清楚它放的是什么,比如 price 比 p 好,max_score 比 ms 好。
练一练
写好代码,点检查。提示随便看,实在想不出来再看答案。
第一个变量
✓声明一个 int 变量 age,值是 30,再用它显示 年龄:30。
年龄:30
1#include <stdio.h>2 3int main(void) {4 5 return 0;6}
三种类型
✓用一个 printf 和这三个变量,显示 尺码 M,单价 19.900000,共 2 件。
尺码 M,单价 19.900000,共 2 件
1#include <stdio.h>2 3int main(void) {4 char size = 'M';5 double price = 19.9;6 int count = 2;7 8 return 0;9}
修好它
✓这段程序编译不过。改好它,让它显示 库存:12。
库存:12
1#include <stdio.h>2 3int main(void) {4 printf("库存:%d\n", stock);5 int stock = 12;6 return 0;7}
这一课学会了
- 变量先声明再用:
int stock;声明,stock = 12;赋值,也可以合成int stock = 12;。 =是把右边的值放进左边的变量;再赋值,新值换掉旧值。int放整数,double放带小数的数,char放一个字符;printf分别用%d、%f、%c。- 用没赋过值的变量是未定义行为;声明时就给它一个值。
sizeof告诉你一个类型或变量占几个字节,用%zu显示。const让变量变成常量,改它会编译错误。- 名字用字母、数字和
_,不以数字开头,不用 C 自己的词,大小写不同。