这是c语言系列的文章。 如果你是初学者,我建议你先读前面的文章。 笔者也按章节顺序发表。
对于第一次学习
变量
编程语言的人来说,变量这个概念的第一反应可能是数学中的自变量x。 在编程中,和这个类似。 这意味着可以更改变量中存储的数据。 但是与数学不同,变量在计算机中有其他属性。
一个变量包含的属性:
变量值变量所在的位置对第一点非常了解。 如果x=1,则变量x的值为1,在x=x 1之后,x的值为2。
第二,必须提到两个东西——存储器和寄存器。
这里暂时不介绍寄存器,留着在后面的章节讨论。 这并不妨碍你学习和使用c语言。
一般来说,由c语言定义的所有变量都存储在内存中。 请暂时无视。 函数的部分参数是存在于寄存器中的事实。 内存是连续的区域,如果进行类比的话,可以参考道路边缘划线的停车场。
一组停车位相当于内存空间,每个停车位相当于这个内存空间的一部分。 我们的变量就像停车位一样。
补充一下,内存的最小存储单位是位(bit ),也称为位。 也就是说,只能记忆一个值。 这个值是0或1。 将8位称为1字节(byte )。
为了更好地管理停车位,我们必须给停车位命名。 这是为了让我们能够迅速确定所在的停车位。 内存也一样。 因此,也出现了地址这个概念。
假设照片中离镜头最近的车的位置是1号车的位置,号码逐个向远处增加。 同时,给1号停车场起了个x的名字。 这时候,有一辆奔驰停在1路车上。 这样,也可以说x中的车是奔驰车。
在内存等价的概念中,我有x这个变量。 其内存中的地址为1,其值为奔驰。
后来,奔驰出去了,路虎又来了。 此时,变量x的值为路虎,可以说其存储器地址为1。
在
常量
之前介绍了变量。 这表示内存中的某些数据是可更改的。 与此相反,不能更改常数,也就是存储在内存部分的数据。 这就像磁盘,暂时不考虑可重写的东西。 一旦写入了内容,就不能再更改了。
常数在c语言中的关键词是const,初学者不需要首先烦恼,而是继续读下去。
在
数据类型
节中,为了说明基本的数据类型,不对数组之类的结构进行说明。
编程语言给出了人为存储在内存中的数据类型。 在c语言中,这些类型如下:
按类型说明整数型,即整数浮点型,即实数字符型,即各个可打印字符(后面将讨论什么是可打印字符)的null型,即无类型指定的指针型。 初学者暂时不需要背各类型的数值范围,根据需要参照范围即可。
分为整数。
带符号的短整数,对应的关键字占用短、2字节的内存。 也就是说,这种类型的数据值的范围为-32、768到32、767的无符号短整数,对应的关键字消耗unsigned short、2字节的存储器,数据值的范围为0到65、535的有符号整数、关键字int 648到2、147、483、647无符号整数、关键字unsigned int、4字节、数据值的范围0到4、294、967、295为代码长度整数、关键字long、32位系统的4字节、数据值数据值范围-9223372036854775808到9223372036854775807无符号长整数,关键字unsigned long,在32位系统中为4个字节,数据值范围从0到4、294、967、295、 在64位系统上,8字节数据值的范围为0~1844674407370951615,还有占8字节内存的长整型和无签名长整型。 数据值的范围分别为- 922337203685475808~922337203685475807和0~1844467440737095807
单精度浮点型,关键字为float,4字节,数值范围从1.2E-38到3.4E 38,精度到6位数小数为准确的倍精度浮点型,关键字为double,8字节,数值范围从2.3E-308到1.7E 308,精度为15位码哥嫌我词穷,不知道中文该怎么办,关键词是long double,占16个字节,数值范围从3.4E-4932到1.1E 4932,精度精确到小数19位,实数都有精度范围。
的,如果超出这个精度范围就会造成精度损失,因此在运行一些除法运算后再执行乘法力图恢复初始值时有时是不可能的。
字符型分为:
有符号字符,关键词char,占1字节,数值范围-128 到 127无符号字符,关键词unsigned char,占1字节,数值范围0 到 255
其中char型字符为可输出字符,参考ASCII码表来找到其对应的输出到终端上的字符:
其中,值为0~31和127的字符是控制类字符,剩余为可显示字符。
空类型:又称为void型,关键字为void,表示无类型或者不知其类型。
指针类型:本节暂时不讨论,留待后续专门讨论指针的文章中详述。
看一些例子
到此,我们来看一下各种类型的例子,巩固一下前面的内容。
整型示例:
short var_1 = -1; //有符号短整型
unsigned short var_2 = 65535; //无符号短整型
int var_3 = 1000000; //有符号整型
unsigned int var_4 = 999999999; //无符号整型
long var_5 = 9876278913; //有符号长整型
unsigned long var_6 = 12871236897; //无符号长整型
long long var_7 = -1238123871; //码哥词穷,这类型你就当是长长整型吧…
unsigned long long var_8 = 1987623453;
const int a = 10; //整型常量a的值为10
const short b = 127; //短整型常量b的值为127
浮点型示例:
float var_1 = 3.141592; //单精度浮点数
double var_2 = 1.124987651; //双精度浮点数
long double var_3 = 3231.3123817682;
const float pi = 3.141592; //单精度浮点型常量pi的值为3.141592
字符型示例:
char var_1 = 70; //有符号字符型
char var_2 = ‘F’; //有符号字符型,var_2和var_1其实是相等的,在ASCII码表中,F的十进制值即为70
//如果要给char型变量赋值ASCII码表中可显示字符,需要用单引号扩住,且单引号内只能有一个字符
//但有一种特例,叫做转译字符例如下面:
char var_3 = ‘\n’; //这里的 \ 就是转义字符,当编译器遇到转自字符时会吞掉转义字符,
//并查看其后字符是什么字符,然后转成相应特定字符,本例中\n为换行符,即ASCII中值为10的换行符。
unsigned char var_4 = 255; //无符号字符型
const char enter = ‘\n’; //字符型常量enter的值为 \n
变量以及常量的命名要求
上面的示例中码哥对变量和常量的名字命名都是形如:
var_xxx
其实在C语言中,变量与常量的名字命名是有规范的,要求如下:
名字必须以字母或者下划线开头,后面的字符既可以是字母也可以是下划线也可以是数字。
所以,形如如下名字是不合法的:
123_abc
-a
+a
123bcd
类型转换
先来看一个例子体会一下:
int a = 5.0 / 2;
/表示➗,即除法。这时a的值是多少呢?
答案是2,而不是2.5。这里就是类型转换起了作用。5.0是浮点数,浮点数除整数,得到的结果还是浮点数,但是这个值赋给了整型变量a,因此除法的结果需要满足a的类型约束,只保留整数部分,因此就是2。这里也不存在四舍五入一说,即便是2.99999也会是2,而不是3。
上面的这种转换叫做自动类型转换,与之相对的转换模式叫强制类型转换。
我们先看下强制类型转换的例子,也就能理解上面这个例子叫自动类型转换了。
int b = (int)2.5;
在这个例子中,如果不在2.5前加(int),那么编译器会给出警告,说你这么写等于是“偷摸地”将双精度浮点数转换为整型了。为了避免这个警告(当然,取整数也是符合这个例子中我的预期的,即我要的也是整数),在2.5前加入:
(基础数据类型) //本例为(int)
将2.5先转成整型2,然后赋给变量b。
下面看一些其他类型转换的例子:
unsigned char var_1 = (unsigned char)’F’; //因为’F’默认为char型
short var_2 = (short)999999; //999999为int型,直接赋值会爆出警告,强制类型转换后不会有警告,但是var_2的值为16959
这里var_2的值为16959的原因是:
整型999999占4字节,其十六进制为0x000F423F。short类型占2字节,因此会将int型的低16位(即后两字节)内容赋给变量var_2,也就是0x423F,这个十六进制数转换为十进制后的值就是16959。
对于十六进制不了解的读者,可以去网上先充一下电,因为十六进制在编程中用到的频度不比整数低。
喜欢的读者可以关注码哥,也可以在下方留言评论,如果有不清楚的地方也可以私信码哥,我会第一时间回复。
感谢阅读!