日更日更,忙的要死所以这个是两天写完的,大学是真的忙,高中老师都是骗人的。真是大工程。
今天按照昨天安排会把关键字,数据类型,运算符讲一下,附带着会写一下内存的概念。关于内存的概念,在后面直到指针前都不会怎么用,但是这里要讲数据类型,是第一个和内存相关的知识点。讲完这些,预备知识就起了,明天开始讲printf,会讲的比较细,初学不必在意太多。
第一个概念,数据,常量和变量。
我们初高中在接触函数这种奇怪的东西后都接触到了常量和变量的概念,在那时,我们知道像1、2、3这样的确定的不会改变的值为常量,我们也叫它们常数,像x,y,z这样的会改变的叫做变量。在c语言里这也是如此。
数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的的原始素材。
在计算机系统中,数据以二进制信息单元0,1的形式表示。
以上是数据的概念,直接复制粘贴自百度百科,简单概括数据的概念就是承载信息的数字和字符。强调二进制,因为要从现在开始培养用二进制思考的习惯,对你debug有好处。
“常量”的广义概念是:‘不变化的量’(利如:在计算机程序运行时,不会被程序修改的量;数学函数中的某一个量,例如每一个具体的圆的半径、直径数值;物理学中的靠近地面的重力加速度;真空中的光速数值;不同的微粒的各自的质量)
即,在程序使用之前已经预设好,在整个程序中不会改变的数据叫做常量。
变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。
即在程序运行期间可能会改变或被赋值的数据。
值得一提的是,如果你没有对变量赋值的话,计算机会自动为其赋随机值。(这一点在下面内存的概念理解后会有更深的认识大概)
好的,第一个概念结束,那么我们开始今天的内容。
关键字,也称保留字,是被系统赋予特定含义并有专门用途的标识符。关键字都是小写的,不能作为普通标识符给变量、函数或标号等命名,但可以作为宏名,因为所有预处理发生在识别这些关键字之前。
上面给出了关键字的概念,特点,斜体部分是目前没有学到的概念,后面会讲到,C语言入门的那个课应该就有。关于预处理这个,想要学好c语言,对其编译过程还是要有了解的。
贴张图片,让大家看看都有哪些关键字。关于各自具体的意思,想要了解的自行百度。今天会讲一些和数据类型有关的,但不是所有的和数据类型有关的,一些要到后面讲。
好的,下面今天最重要的内容,数据类型,更准确的说,基本数据类型。
在讲述下面内容之前,一定要了解计算机数据单元和储存单元的单位。即 位,字节和字。主要是前两个。
数据是程序处理的对象。数据的取值范围及能对该数据施行的运算由该数据的类型决定。数据类型也就是数据的储存方式,它告知编译程序为该类型的对象在内存分配多大的空间,数据类型直接反映了一种语言的数据表达能力。——《c语言与程序设计》
c语言的类型非常丰富,包括整型、浮点型、复数类型(我反正没用过的鬼东西)、指针(可怕又烦人的鬼东西)、数组(和上面的鬼东西一起烦人的鬼东西)、结构(头都要大了)、联合(用的少)等。
可以把C语言的数据类型分为三大类别,即基本类型,导出类型,和空类型。上图。今天只讲基本类型里的整型和浮点型。有的地方说基本类型分为整型,字符型和实型这绝对是错的,字符型属于整型
首先是整型,和数学的概念一样,在c语言里,整数是没有小数部分的数。计算机以二进制数字储存整数。例如:7换成二进制是111.如果在8位即1字节的空间里储存就会储存为00000111,前5位是0,后3位是1。
整型中最著名的类型应当是int了。int类型是有符号整数,即int类型的值必须是整数,可以是正整数,负整数或零。其取值范围是根据计算机的系统改变的。一般来说,储存一个int要占用一个机器字长。早期16位机时,int的取值范围是-32768~32767(总共是2^16),随着计算机逐渐发展,现在64位处理器风行,为了保证原有的程序仍可以使用ISO C规定int的取值范围最小为
-32768~32767。
声明一个int型变量就是先写上int,然后再写变量名,变量名之间用逗号隔开。
例子:
int erns;
int hogs;
int cows, goats;
上面创建了这些变量,但是我们没有赋值,前面讲了,没有赋值的电脑会自动赋值,但是电脑也不知道我们要什么值,所以我们自己赋值。
变量有多种途径可以获得值,这里只讲赋值和初始化。
赋值,比如:cows=101;那么cows的值就变成了101。
初始化,就是为变量赋一个初始值。可以直接在声明里完成。
比如:
int hogs = 21;
int cows = 32, goats = 14;
int dogs, cats = 94 //有效,但让人误解,这个只为cats赋了值,dogs并未赋值。
现在我们引出内存的概念。上图:
从前有一个叫做计算机的开了一个旅馆,旅馆的名字叫做内存。这个旅馆主要对一些名为变量的顾客开放,变量一但声明,计算机就会为其开一间指定大小的房子,里面住变量被赋的值。如果变量本身没有赋值,那么计算机就只会为其分配一个房间而不会改变里面的内容。这也就是所谓的随机赋值的来历,内存空间存在于计算机中,在其他程序运行时可能被使用过并且赋有值,而这个值并未被删除,一直都在这个空间中,当随机分配到这个空间作为一个未赋值变量的房间时,就出现了所谓的随机命名的情况。(关于这个地方,我表达能力问题,没有讲清楚,有疑问可以评论区提问)
大家注意到我经常使用房子作为一种形象化,房间和程序,计算机都有着很大相似性。
下面简单写一下,其他整型。C语言提供有3个附属关键字修饰基本整数类型:short,long,unsigned。
short int类型(简写为short)占用的储存空间可能比int类型少,常用于较小数值的场合以节省空间。C语言只规定short占用的储存空间不能多于int,一般来说short占16位。
long int(简写为long)占用的储存空间可能比int多,适用于更大数值的场合。一般占32位。
long long int(简写为long long)占用的储存空间可能比long多,适用于更大数值的场所。至少64位。
以上三种均有符号,即有正负值。
unsigned int(简写为unsigned)只用于非负值场合。范围大小仍然一样,比如16位的unsigned int的取值范围就是0~65535(32768+32767也就是2^16-1)。
如果你看了原码反码补码的知识你就会知道这是用于表示负号的符号位现在用来表示另一个二进制了。但是具体的我就解释不清楚了,有待了解
类比于上面的也有unsigned long, unsigned long long, unsigned short。前面说了这个是修饰就是像玩游戏时一样附魔加了个属性。
同样signed也是修饰,可以强调你在使用有符号类型。
要谅解C语言,没有详细的规定他们每种的具体取值范围。因为C语言太老了,计算机一直在发展,还发展的那么快。
现在个人计算机上最常见的设置是,long long64位,long占32位,short占16位,int占16位或32位。
整数溢出:
如果整数超出了相应类型的取值范围会怎样?大家先试试,给个代码,体会一下。
#include
int main(void)
{
int i = 2147483647;
unsigned int j = 4294967295;
printf("%d %d %d", i, i+1, i+2);
printf("%u %u %u", j, j+1, j+2);
return 0;
}
体验一下整齐的代码风格,源代码来自C Primer Plus。
下面是字符变量类型char。但它还是整型。
char类型用于储存字符(如,字母或标点符号),但是从技术层面来看,char是整数类型。因为char也可以用作8位的整型。因为实际上储存的并非字符而是整数。计算机使用数字编码来处理字符,即用特定的整数表示特定的字符,我们最常用的就是ASCII码。
上图:ASCII码,关于这部分的内容百科讲的很详细了,后面printf函数会讲一下。
1、声明char类型
如:
char response;
char itable, latan;
2、字符常量和初始化
如果把一个字符变量初始化为字母A,不必使用ASCII码(当然也可以)
比如:
char grade = 'A';
注意使用单引号括起来。在c语言中使用单引号括起来的单个字符被称为字符常量,编译器发现'A',就会将其转化为相应的ASCII码的值储存起来。
当然也可以
char grade = 65;//不是好习惯。
3、关于有无符号(char其实是整型):
有些编译器将其识别为有符号,有些识别为无符号。我们可以使用signed或unsigned对其进行标识。当然如果我们只用其处理字符,那么不需要任何修饰符,直接用就好。
布尔类型:一般用不到,我们要知道这个值是用于表示逻辑的。只占1位。1表示真,0表示假。
okok,整型到此结束,真是太多了。
浮点型:
先讲清楚何为浮点数
浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。
就理解为实数就好。
然后还有浮点数的特殊计数方法,e记数法,就是用e代替科学计数法里的10。e后面的数字表示幂。
最基本的,float。
C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是10^(-37)~10^37, 意思就是float至少能表示6位数字,比如33.3333333,就是至少能表示33.3333,通常一个浮点数占32位。其中8位用于表示指数的值和符号,剩下24位用于表示非指数部分及其符号,上图。
单独一篇手记会用来讲浮点数的储存方式,所以不必在意。
double:双精度(注意这个词,可以自己百度思考)浮点数,和float最小取值范围相同,但至少能表示10位有效数字。一般占64位。
long double:比double精度更高,C语言只保证精度至少和double相同。
声明浮点型变量,其实和整型都一样了。
比如:
float noah, joah;
float placks;
double trouble;
long double top;
赋值:
比如:
可以使用最简单的
float i = 0.1;
也可以
float j = 6.63e5;
以上内容讲的飞快,因为没有什么实际价值,这些具体原理会单出手记讲解。
最后是运算符。(同样会单独讲一些运算符,在另一篇手记里)
只讲两个概念,优先级和结合性。优先级就是像乘法先于加法这样的,而结合性则是同优先级使用的,比如a+b-c,+,-这一层的运算符具有左结合性所以b和左边的+结合。当然这个例子本身没有意义,先算哪个都一样。但是对于计算机来说就有着这样的意义。
上图。