Kodewick
第 2 课,共 30 课目录

变量和类型

第 2 课,共 30 课 · 第 1 部分 · 起步 · 约 15 分钟

程序要记住一些数:考试的分数、商品的价格、仓库里的库存。变量就是一个有名字的格子,里面放一个值。在 C 里,用变量之前要先说清楚两件事:它叫什么,放的是哪种值。

main.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; 是赋值:往格子里放一个值。这两步可以分开写,也可以像上面那样合成一行。变量要先声明,后面的语句才能用它。

main.c
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}

三种基本类型

C 的每个变量都有固定的类型,声明时写在名字前面,以后不能改。先认识最常用的三种:

类型放什么例子printf 用
int整数90、-3、0%d
double带小数点的数4.5、-0.25%f
char一个字符,写在单引号里'A'、'7'、'?'%c
main.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}

一个 printf 显示几个值

一个 printf 里可以有好几个格式符,后面的值用逗号隔开,按顺序一个对一个:

main.c
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 不管:里面可能是任何数,这次和下次还可能不一样。用这样的值是未定义行为。在普通的电脑上,程序会照样跑下去,显示一个莫名其妙的数。我们的引擎会停在出事的那一行,告诉你是哪个变量:

main.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 显示:

main.c
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,它就成了常量;以后谁想改它,编译器都不答应:

main.c
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_pricetotal-price
不能以数字开头day22day
不能有空格max_scoremax score
不能用 C 自己的词countint

另外,大写和小写是不同的字母,score 和 Score 是两个变量:

main.c
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 好。

练一练

写好代码,点检查。提示随便看,实在想不出来再看答案。

练习 1

第一个变量

声明一个 int 变量 age,值是 30,再用它显示 年龄:30。

要显示
年龄:30
exercise1.c
1#include <stdio.h>2 3int main(void) {4 5    return 0;6}
输出
点「运行」或按 Ctrl+Enter
练习 2

三种类型

用一个 printf 和这三个变量,显示 尺码 M,单价 19.900000,共 2 件。

要显示
尺码 M,单价 19.900000,共 2 件
exercise2.c
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}
输出
点「运行」或按 Ctrl+Enter
练习 3

修好它

这段程序编译不过。改好它,让它显示 库存:12。

要显示
库存:12
exercise3.c
1#include <stdio.h>2 3int main(void) {4    printf("库存:%d\n", stock);5    int stock = 12;6    return 0;7}
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • 变量先声明再用:int stock; 声明,stock = 12; 赋值,也可以合成 int stock = 12;。
  • = 是把右边的值放进左边的变量;再赋值,新值换掉旧值。
  • int 放整数,double 放带小数的数,char 放一个字符;printf 分别用 %d、%f、%c。
  • 用没赋过值的变量是未定义行为;声明时就给它一个值。
  • sizeof 告诉你一个类型或变量占几个字节,用 %zu 显示。
  • const 让变量变成常量,改它会编译错误。
  • 名字用字母、数字和 _,不以数字开头,不用 C 自己的词,大小写不同。