欢迎光临
我们一直在努力

1-3 变量与基本类型

1-3 变量与基本类型

⏱ 本节预计用时:25分钟

本节意义:上一节你跑了 hello.c,屏幕弹出了你的名字,很牛逼。

这一节我们将会干更nb的事情,你将能输出自己的身高、年龄等等信息,并且知道变量和数据类型是什么,为什么要有数据类型,这些都是C语言的地基,后边每节必用。

本节目标:知道变量是啥、为啥要有数据类型;能定义变量存数据,用 printf 输出自己的身高年龄;认识 int、float、char 这几个基本类型。

1 你的第一个"有数据的程序"

新建一个文件,叫 3-1about_me.c,把下面的代码敲进去。注意——有三个空是需要你填的:

#include <stdio.h>

int main() {
int myAge = ______; // 🔥 填你的年龄
double myHeight = ______; // 🔥 填你的身高(比如 1.75)
char myFirst = '___'; // 🔥 填你爱人名字第一个字的首字母(比如 'W')

printf("===========================\\n");
printf(" 我的个人档案\\n");
printf("===========================\\n");
printf("年龄:%d 岁\\n", myAge);
printf("身高:%f 米\\n", myHeight);
printf("首字母:%c\\n", myFirst);
printf("===========================\\n");

return 0;
}

依旧交给ai编译运行。

3-1 关于我

这是一个有变量的程序。

上一节你只是改了改 printf 里的字——程序输出什么字,你就在代码里写什么字。但这一次不一样:你把年龄写在 myAge 里,printf 用 %d 把它"挖出来"显示。你改 myAge 的值,输出跟着变。

这就是变量的核心——数据存在一个"格子"里,用到的时候去格子里拿。你不必每次都在代码里手写"18岁",你只需要告诉程序"去 myAge 那个格子里看"。

int、double、char 就是格子的种类(学名叫数据类型),其中int是整数类型,只能存整数,double是小数(学名叫浮点数)类型,只能存浮点数,char是字符类型,只能存字符。

你告诉计算机数据的类型,它就知道运行这段程序时,该给你这个变量分配多大的空间。下面我们先来介绍空间大小相关的概念,再看这几种盒子占多大空间。

2 空间计量单位介绍

前面我们说了,计算机只能认识二进制数,那么最小的单位也就是一个二进制数,叫1位(又叫1bit,1b)。

1B = 8b(B又叫byte,字节)

1KB = 1024B = 210次方B

1MB = 1024KB = 210次方KB

1GB = 1024MB = 210次方MB

KB,MB,GB,是不是挺熟悉的?平时我们去下载游戏,下个软件,买流量套餐,是不是都说这个要多少多少多少MB,多少多少GB?但这些是形容有多少个二进制数的单位呀?

这时你突然顿悟了,原来游戏本质上是一堆二进制数,软件本质上是一堆二进制数,网上传的数据本质上也是一堆二进制数!不管是int、char、double,还是别的类型的数据格子,里边存的都是二进制数!

既然里边存的都是二进制数,为什么打印出来不一样?整数就是普通数字、小数会带小数点、字符还可以是字母?因为printf这里的占位符不一样,”挖出来“显示的方式不一样,你再回看刚才的代码,整数:%d,小数:%f,浮点数:%c,字母是不一样的。

ok,我们知道空间大小了,那我们怎么看int,char,double这些盒子占多大空间呢?

用sizeof。

3 sizeof——看看每个盒子占多大空间

新建文件 3-2sizeof.c,敲入以下代码:

#include <stdio.h>

int main() {
printf("===== 各类型占多少字节 =====\\n");
printf("int :%zu 字节\\n", sizeof(int));
printf("float :%zu 字节\\n", sizeof(float)); //float也是小数类型,比double的格子小
printf("double :%zu 字节\\n", sizeof(double));
printf("char :%zu 字节\\n", sizeof(char));
printf("===========================\\n");
return 0;
}

编译运行。你应该会看到类似这样的输出:

===== 各类型占多少字节 =====
int4 字节
float4 字节
double8 字节
char1 字节
===========================

ok,我们知道了每个格子有多大。

具体是怎么存的?整数、小数、字符类型,和二进制数的对应关系是什么样的?这些问题在后续的书籍里会详细介绍。

4 声明、赋值与打印变量

新建文件3-3变量初始化.c。

变量可以先声明后赋值:

int result; // 声明就是宣布:我有一个整数盒子叫result
result = 100; // 赋值就是往已经有的盒子里放东西;这个声明+赋值的过程也叫初始化

也可以声明的同时赋值,

int count = 0; // 整数可以取0
int temperature = 5; // 可以取负数
double height = 1.0; // 有小数点都是浮点数,后边有0也是
char symbol = '1'; // 数字也可以做字符,这里的'1'和数字里的1不一样,不能拿来运算。
char letter = '&'; // 特殊符号也是字符
char homework = ' '; // 空格也是字符

还可以一口气初始化多个:

int a = 10, b = 20, c = 30;
int x, y = 20;// 注意,只有y被赋值了,这里的x没有被赋值,为垃圾值(垃圾值就是没有意义的数据)
// 在程序运行时,数据位于内存里,对变量赋值本质是对内存里代表该变量的格子写入数据,如果没有做这个写操作,这个格子里就依然是之前运行程序时的留下的值,这对于本次程序的运行是没有意义的。

3-2 变量初始化

新建文件3-4打印变量.c:

double score = 95.5;
printf("成绩:%f\\n", score); // 输出:成绩:95.500000(默认显示6位小数)
printf("成绩:%.1f\\n", score); // 输出:成绩:95.5(%.1f 表示只保留1位小数)
printf("成绩:%.2f\\n", score); // 输出:成绩:95.50(%.2f 表示保留2位小数)

char c = 'A';
printf("字符:%c,对应的数字:%08b\\n", c, c); // 输出:字符:A,对应的二进制数:01000001。前面我们说计算机里只能存二进制数,也就是说实际存的是01000001这个数。
// 于是,你就产生了一个大胆的想法。你将原本的'A'换为了01000001!

c = 0b01000001; // 前面加0b说明自己是二进制数,和十进制数做区分。
printf("字符:%c,对应的数字:%08b\\n", c, c); // 输出:字符:A,对应的二进制数:01000001!

3-3 打印变量

之所以能这样做,本质上是因为数据在内存空间里的保存形式一样。

这是我们第一次看到数据类型的转换(简称为类型转换),后边还会碰到很多次,这个知识点很容易踩坑,我只讲最容易踩的几个坑,其余的你碰到问题问ai。

5 容易踩的坑

5.1 给整数类型输入小数,小数部分被截断

int age = 3.5;
printf("age = %d\\n", age);

这段代码输出和想象中不一样:

age = 3

怎么回事?int 这个盒子装不下小数点,它会直接把 .5 扔掉,只保留 3。不是四舍五入,是直接砍掉。这就是类型不对的后果,变量里实际的值和预想的不一样。

5.2 整数做除法,结果还是整数

#include <stdio.h>

int main() {
double result = 5 / 2; // 除号是/,乘号是*
printf("5 / 2 = %.1f\\n", result);
return 0;
}

猜猜输出是什么?

5 / 2 = 2.0

2.0?不是应该 2.5 吗?!

这就是整数除法的陷阱。两个 int 做除法,结果还是 int——小数部分直接被砍掉。数学里 5÷2=2.5,但 C 语言里 5 / 2 = 2。

正确写法:

double result = 5.0 / 2.0; // 浮点数做除法,得到浮点数结果
printf("5 / 2 = %.1f\\n", result); // 输出:5 / 2 = 2.5

5.3 char 用了双引号

char grade = "A"; // 错!双引号是给字符串用的
printf('age = %d\\n', 3.5);//错!单引号是给字符用的

正确:char grade = 'A';(单引号) 点数结果 printf(“5 / 2 = %.1f\\n”, result); // 输出:5 / 2 = 2.5

赞(0)
未经允许不得转载:171主机测评 » 1-3 变量与基本类型
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址