C语言快速入门 - 变量
目录
- C语言快速入门
- C语言快速入门 - Hello World 详解
- C语言快速入门 - 变量
- C语言快速入门 - 简单运算符
- C语言快速入门 - 控制语句
概念
首先,我们先来了解下什么是变量。
变量,顾名思义,他是可以被改变的一个量。
那么它是用来干什么的呢?我们还是先看一段示例程序吧。
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d",&a, &b);
int c = a + b;
printf("%d + %d = %d", a, b, c);
return 0;
}
首先,我们先把他复制到编辑器里,在保存编译运行看一下结果吧!
运行结果这其实就是一个加法器罢了。
那么我们来分析一波代码。
首先我们来看main
函数里的第一行:
int a, b;
那么这句话定义的就是我们所说的变量了。
什么是变量呢,我们可以把它想成函数里的x,里的x就是一个变量。代数中,我们将可以变的,或者未知的值写作为为,可以用来计算什么的,比如
x = 1
y = 2
那么x + y = 3
事实上,C语言中的变量就是可以这么来使用的。
那么,变量在计算机中是来储存数据的。既然谈到了数据,那么自然就离不开数据类型。
数据类型
在了解数据类型之前我们先来了解一下变量在计算机中是如何储存的。
内存
我们的电脑里有两个地方是用来存储数据的,一个叫做硬盘,一个叫做内存,我们的文件什么的其实都是储存在硬盘里的,因为存在硬盘里的东西可以永久保存。而内存呢,它也可以存储数据,但是一旦电脑关机或者断电之后,里面的东西就都将丢失,所以,我们不用它来储存文件,但是我们可以使用内存来储存变量。
与硬盘大小比起来,内存则小得多。 我的电脑里的内存大小为16GB一般来说,我们现在电脑硬盘动不动就500多GB,甚至1TB之类的,但是内存始终就差不多在8GB-16GB左右。
现在手机都有着8+256,10+512之类的说法,而前面那个小的数字便是内存(RAM)的大小,越多的内存意味着我们能同时开越多的程序,因为一个程序他会有很多变量和其他的东西来占据内存。
现在,我们知道了,内存是一个用于储存临时数据的硬件,而变量就是储存在其中的。
定义不同类型的数据将会分配大小不一样的内存空间。而一定的内存空间只能储存一定量的数据,因此我们也可以简单地认为C语言的数据类型就是来给不一样大小和类型的数据分类的。
有了上文提到的概念,我们就可以把数字类型分成整数和小数,负数和非负数。
整数
整数中根据数字大小可分为5种,在C语言里分别为叫做long long, long, int, short, char,翻译成中文分别为长长整型,长整型,整型,短整型,字符型。
下面的一张表则可以告诉你每一种类型的范围(大小与不同的操作系统和CPU的位数有关):
类型 | 储存的数据范围((类)Unix_64位) | 储存的数据范围(Windows_64位) |
---|---|---|
char | [-128, 127] | [-128, 127] |
short | [-32768, 32767] | [-32768, 32767] |
int | [-2147483648, 2147483647] | [-2147483648, 2147483647] |
long | [-9223372036854775808, 9223372036854775807] | [-2147483648, 2147483647] |
long long | [-9223372036854775808, 9223372036854775807] | [-9223372036854775808, 9223372036854775807] |
仔细观察,其实他们都是次,究其原因,因为在电脑里是用二进制进行储存的。
补充:电脑里的一个二进制位0/1其单位为b(bit,位),8个二进制位0/1叫做字节,单位为B(Byte,字节)。也就是说1B = 8b。
那么我们来对比下数据,比如char类型,它是,但是实际上它在内存里占的是8位,也就是1字节,为什么呢?其实,它最前面那位是符号位,用于指示数据的正负。
相应的,我们也能弄出这样一张表来:
类型 | 占用的字节数((类)Unix_64位) | 占用的字节数(Windows_64位) |
---|---|---|
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4 |
long | 8 | 4 |
long long | 8 | 8 |
由于第一位用于了符号位,因此就略显浪费,其实,我们的C语言早有准备。unsigned关键字正解决了这个问题。
比如,我们在char前面打上个unsigned关键字就可以让char储存范围里的数字。
类型 | 储存的数据范围((类)Unix_64位) | 储存的数据范围(Windows_64位) |
---|---|---|
unsigned char | [0, 255] | [0, 255] |
unsigned short | [0, 65535] | [0, 65535] |
unsigned int | [0, 4294967295] | [0, 4294967295] |
unsigned long | [0, 18446744073709551615] | [0, 4294967295] |
unsigned long long | [0, 18446744073709551615] | [0, 18446744073709551615] |
这就是所有的整数类型了。
小数
小数在C语言里也是分的,具体表现形式不仅是大小是的差别,还有精度(最多储存到小数点后的位数)上的差别。
类型 | 储存的数据范围(64位) |
---|---|
float | |
double | |
long double |
同样的,我们再放上一张占用内存字节的表:
类型 | 占用的字节数(64位) |
---|---|
float | 4 |
double | 8 |
long double | 16 |
上面便是所有的常用数据类型了。
有了这些知识,那么我们再来看看怎么定义一个变量吧。
定义变量
格式:
<数据类型名称> [变量名称];
比如
int a;
这样我们就定义了个名叫a
,类型为int
的变量了。
我们也可以给他赋予初值。
int b = 10;
这样,我们则得到了一个值为10的变量b
了。
当然同时定义多个变量也是可以的:
int a, b, c;
这样,我就同时定义了3个变量了。
当然,定义多个变量并赋予初值也是没问题的。
int a = 10, b = 20, c = 30;
但是,这边要注意一下:
int a, b, c = 10;
在这句话中,我们定义了三个变量a
,b
,c
但是,得到值10的只有一个,那就是c
,只有c
得到了初值10。所以这种写法是挺糟糕的,容易混淆。
在变量定义的时候我强烈建议大家赋予初值,不然到时候使用起来可能会出现莫名其妙的问题(我曾被这个苦恼过)。
变量命名
在例子中,我定义的变量无非就是a
, b
, c
三个,名字特别的简单,其实呢,变量可以有很复杂的名字,像int myInteger;
这样定义也是可以的。代码长的话就不要使用a,b,c,d之类的简单字母了,到时候看不懂就麻烦了,得用英文单词,这样既对你英语有帮助也易读,单词与单词之间不要空格,这样编译器会以为是两个分开的东西,然后报错,所以要在第二个单词及以后的单词的首字母用大写标出,比如:myApple
、viewPager
、darkBlueSky
……当然这样写也是一种方案:my_apple
、view_pager
、dark_blue_sky
……
当然,变量的命名也是有规则的,有些变量的写法是不被允许的,下面我将探讨这个问题。
-
不能使用关键字。大家有没有注意到,我们在写代码的时候,有些单词会被特殊的颜色标记出来,其实那个就是关键字,常见的关键字有诸如
int
、char
、double
、if
……他们有些是数据类型名称,有些则是控制语句(后面会提到)。 -
不能以数字开头。变量名我们可以用
hello1
、jack2
之类的,但是切记不能用1hello
、2jack
,这样是不合法的。 -
区分大小写。
int a = 10;
与int A = 20;
定义的是不同的两个变量。
常量
既然提到了变量,也就是值可变的量,那么自然也少不了常量,也就是说,他的值无法被修改。
const int MAX = 10;
这样,我们就定义了一个常量,他与变量定义唯一的不同就是在前面加上了const
关键字,意味着我们定义的是一个常量。
同样的,常量命名遵守变量命名的规则,但是我们一般约定常量用全部大写的形式来表示。比如MAX_SUM
、LEAST_MONEY
……单词之间用空格表示。
然后我们再来看下面一行scanf("%d %d", &a, &b);
。
首先我们看看scanf
这个函数吧。
scanf
scanf
这个函数是输入的意思,而%d
则是一个占位符,一个占位符代表我们要输入一个值,两个则是两个,比如我们例子中就有两个%d
,也就是说,我们要输入两个值,而例子中两个%d
之间有一个空格,其实加不加都可以,问题不大。
那么逗号后面为什么要跟两个变量呢,因为,一个%d
对应一个变量。在那个例子里,scanf("%d %d", &a, &b);
意思是输入两个10进制整形数据,并赋予给a
和b
。他是按顺序的,第一个%d
对应的就是后面第一个a
,第二个则对应的是第二个b
,以此类推。至于那个&
,暂时不需要理解,真想懂可以看我另一篇文章《C *&的用法》。
那么%d
是什么意思呢?d
是decimal(十进制)的缩写,所以读入的是两个10进制整形数据。
小数怎么读入呢?
float a;
scanf("%f", &a);
用%f
即可。
我们还是来看下表吧,就是个对应关系。
类型 | 用的%
|
---|---|
char |
%c 或%hhd
|
short | %hd |
int | %d |
long | %ld |
long long | %lld |
float | %f |
double | 输入用%lf 输出用%f
|
long double | %Lf |
unsigned char | %hhu |
unsigned short | %hu |
unsigned int | %u |
unsigned long | %lu |
unsigned long long | %llu |
注意:用%c
读入char可以输入一个字符来读入,%hhd
则是以十进制读入。
比如:
char a;
scanf("%c",&a);
printf("%hhd",a);
测试下这个程序:
输入
a
输出
97
具体对应数值可参见ASCII表。
那么我们也能联想到输出是不是也是可以用这些呢?
答案是肯定的。
比如:
int a = 10;
float b = 0.1;
double c = 0.2;
long double d = 0.3;
printf("a = %d, b = %f, c = %f, d = %Lf\n", a, b, c, d); // 这里的%d对应的就是后面的a,第一个%f则是b,第二个%f则是c,……,按顺序的,以此类推
细心的同学应该发现了,输出double的那个%用的是%f
而不是%lf
,这边注意下就好了,输出的话用%f
,因为有些编译器不认%lf
的,而printf里的%f
和%lf
效果是一样的,为了兼容,我们还是用%f
吧。
在看那个int c = a + b;
吧,这个就是定义了一个变量c
,并把它赋予初值为a
和b
的和。
最后那个printf便是输出结果了。
结语
这篇文章涉及的概念较多,尤其是新增的scanf
语句,以及新的printf
用法,但是其实也是好理解的,类似%d
的这种,我们可以把它看作为一个占位符,它代替的便是变量的值,而输出的时候,我们的编译器就会把这个占位符去掉,换成我们变量里的值。更多的,我们可以百度printf的用法。欢迎大家继续阅读我的下一篇文章《C语言快速入门 - 简单运算符》。