C·Quickstart(变量与变量类型)

前一篇快速地浏览了几种常见的功能,不过对于真正理解其中的概念来说,一篇文章是远远不够的。因此,接下来的几篇就详细讨论一下这些出现的概念。

因为主题是快速入门,所以着眼点还是在于实用性。这些介绍不会覆盖所有的知识点,而是着力于使你有一个解决问题的思路,细节在需要的时候查查资料就好了。只要思路清晰了,编程就不再困难。那么,就让正文开始吧!

变量以及它们的类型

变量这个概念,如果用比喻的方式来说明就会很好理解。

C·Quickstart(变量与变量类型)_第1张图片
variable.png

一个变量,就相当于一个盒子,里面存放了数字。对于这个盒子,我们可以把数字取出来查看,也可以把旧数字丢掉,换成新的数字。因为盒子里的数字可以修改,所以它就是一个变化的量,简称变量。

为了存放不同类型的数字,我们需要不同类型的盒子。在C语言中,最常用到的有以下几种类型:

  • 整数 int
  • 单精度浮点数 float
  • 双精度浮点数 double
  • 字符 char
  • 布尔类型 bool

这些基本的变量,以及它们的组合,满足了我们平时见到的绝大部分程序的需求。从快速入门的角度来说,熟悉这些就满足了最低限度的要求。

首先,声明变量!

声明变量相当于创建出了一个盒子,给盒子取个名字,这是使用变量的第一步。像这样:

int number; //声明一个变量叫number
int x,y,z; //同时声明多个变量

这样就是一个int类型的变量。也可以在声明时一起赋值,这叫做初始化(initialization),就是一开始就把一个数字放进盒子里。

int number = 0;
int x=1, y, z=3; //x为1,y未初始化,z为3

初始化是很推荐的,因为如果变量没有初始化,它的值可能是任意的。如果没有为它赋值,而是直接读取了这个任意的初始值,程序会出现无法预料的运行结果。人难免会疏忽,所以为了避免自己的大意,初始化是一种保险的办法。

float dog = 1.0f;  //f 表明这个数字是float类型的,可以不加
double cat = 1.0;  //没有f结尾的小数,编译器认为是double
char fish = 'A';   //字符的初始化就是用单引号加一个字符
bool isPig = false; //布尔类型只有true 或 false两种值

字符是一种特殊的变量,虽然我们操作的时候用单引号和字符,但本质上它以数字的形式存储在计算机中。另外,你可能会吐槽,这单个字符有什么用啊,至少也要能存单词吧!嗯,你的直觉非常敏锐!这涉及到了字符串,另一个很重要的概念。

布尔类型是另一种特殊的变量,只有true或false两个值,也就是“是”和“否”两种情况。这在控制流中很有用。

字符和布尔类型我会在后续的文章中详细介绍的,总之先来看这些简单的数值变量吧!

开始计算!

有了盒子,我们可以对它做很多奇奇怪怪的事情。首先还是声明:

int a, b = 0;     // a未初始化,b初始化为0

之后为a赋值:

a = 1;        //令a为1
a = a + 1;    //让a增加1
a ++;         //让a增加1的另一种写法
a = b;        //把b的值赋给a
a = 1.0;      //???

这样就能把想要的数字塞进盒子里,把旧的数字替换掉了。

语句的功能我在注释中写明了,不难理解。我相信你可以仿照这些语句,把数值修改为自己想要的结果。在最后一句中,我把double类型的值赋给了int类型的变量,你猜它会是什么结果呢?我先卖个关子,在本文的后半部分,你会找到答案。

输出看看!

依然是出于实用性的考虑,我们要把数值打印出来,不然我们既没办法获得计算结果,也没办法检查计算得对不对,不是吗?为了打印数字,我们用到printf函数。

这里插一句,printf指的是print format。print是打印,format 是格式化字符串的意思。这个函数接收字符串作为参数,把它打印在屏幕上。如果按照一定的格式来书写这个字符串,我们就可以打印变量的值。

int a = 0;
printf("An integer: %d\n", a);

输出结果:

An integer: 0

这里,printf接收了两个参数,第一个是格式化的字符串,第二个是变量a。为了输出整数类型,我们在字符串中需要放入数值的位置放入"%d",这叫做格式控制符。有了格式控制符,printf会在参数表中按顺序搜索,发现了变量a,就把它的值打印在控制符对应的位置了。“\n”表示换行符,它后面的文字会出现在下一行。

适用于不同类型的输出控制符是不一样的:

  • 整数 %d
  • 单精度浮点数 %f
  • 双精度浮点数 %lf
  • 字符 %c
printf("Four types: %d %f %lf %c",5, 1.5f, 2.0, 'A');

这里直接把数值传递给了printf,这也是可以的。在这一句中,一共出现了4个控制符,printf会搜索4个变量,把它们的值打印在对应的位置。

类型转换

既然都是数字,那么它们当然可以互相转换,只是在转换的过程中会发生信息的丢失。比如从浮点数3.14转换到整数,结果是3,小数部分会丢失。

所以基本上,信息量double > float > int,转换时尽量不要把信息量大的类型转换到小的。

类型转换的方法:

(1) 编译器自动转换:

int a = 5;
float b = 3.5f;
float c = a * b; //a被临时转换为float,与b的类型相匹配

在这里,编译器会把a临时变成float类型,然后计算出结果。这样的临时转换不会改变a自己的值和类型。

int a = 0;
float b = 3.5f;
a = b;

这时,为了把b的值赋给a,编译器把float类型转换成了int。当然小数部分丢掉了,结果是3。反过来,如果是把int赋值给float,则不会发生信息的丢失。

(2) 手动转换:
手动转换的意义在于避免整数相除可能会造成的尴尬后果:

int a = 5;
int b = 10;
float c = a/b;

你猜结果是多少?0.0f。因为int类型之间发生的除法结果仍然是int类型,所以5/10取整之后变成了0。0被赋值给了float类型的c,就成了0.0f。为了纠正这种情况,要把代码改成下面这样:

int a = 5;
int b = 10;
float c = (float)a/b;

这里加了一个括号,就把a手动转换为了float。为了与float类型的a计算,b会被自动转换为float,因此最后得到0.5f。这样的手动转换也是临时的,a本身不会受到影响。

写到这里,你一定知道了前面的问题的答案了。啊?哪个问题?这个呀,这个:

int a;
a = 2.0;

a的值是多少,现在看来答案是很显然的了,快写个小程序验证一下吧!

小练习

虽然这篇文章其实没写多少内容,但是考虑到写太长了很难读,先写到这里好了。如果之后觉得不妥,还会调整篇幅,那么留下几个小练习:

  • 尝试使用几种类型变量,并且做些转换
  • 输出几种类型的变量的值

就到这里,我们下一篇再见啦~

你可能感兴趣的:(C·Quickstart(变量与变量类型))