数据类型
在C语言中的数据类型分为两个大类:内置类型和自定义类型,而在这两类的下面还细分出其他数据类型(如下图)。
内置类型就是C语言自带的类型,包含字符型(char),整型(int,short,long),浮点型(float,double),以及布尔类型(_Bool/_bool)。
自定义类型显而易见就是自己定义的数据类型,主要包括数组,结构体(struct),枚举(enum),联合体(union)。
我们看到整型和浮点型下又有了其他分支,而它们的区别就在于储存数据的大小不同。
布尔类型是一类特殊的数据类型,专门用来表示真和假的(在C语言中,0表示假,非0表示真),
使用布尔类型必须包含头文件<stdbool.h>
各种类型的长度
为了求出每一种数据类型的长度(及储存数据的大小),需要利用到一个库函数---sizeof。
可以看到,每种类型的长度大小都存在区别,这些长度的单位是1个字节(byte),但是计算机最小的储存单位是bit。计算机中的单位之间的关系:1 byte=8 bit,1 KB = 1024 byte,1 MB = 1024 KB,1 GB = 1024 MB,1 TB = 1024 GB,1 PB = 1024 TB......这些类型的长度不同就意味着它们储存着大小不同的数据,一个字符只占一个字节,而一个整型占4个字节,也就是32个bit,可以储存相当大的一个很大的数了。
关于sizeof这个库函数,我们不仅可以这样使用,还有其他的形式来使用:当sizeof括号里面是变量名的时候,sizeof的括号可以省略。
但当括号里面是类型的时候,括号不可以省略。
sizeof这个库函数有一个我们初学者易犯错的点:sozeof后面的表达式是不真实参与运算的,只是根据表达式的类型来得出大小。
我们可以看到sizeof后面的表达式b=a+2并没有执行,b的值依旧是2,而又因为b是short型,所有sizeof的结果也是2。
signed与unsigned的区别
signed与unsigned在名字上就是有符号和无符号的区别,这个符号是什么意思呢?
signed 有符号,表示一个类型带有正负号,包含负值;
unsigned 无符号,表示一个类型不带有正负号,只能表示正值。
C语言默认创建的一个变量就带有正负号,及有符号,例如:int = signed int; short = signed short ,long = signed long,signed可省略;
在创建一个无符号的变量时,unsigned不可省略。
特例:当修饰char时,char到底是signed char还是unsigned char,取决于编译器。
变量的类型
变量主要有两种:局部变量和全局变量;
通俗的讲,大括号内定义的变量都是局部变量,大括号外定义的变量都是全局变量;
全局变量顾名思义,在整个程序都可以使用,局部变量就只能在创建它的大括号内使用。
当将在main函数内创建的b变量在arr函数中使用时,编译器就会报错:未定义标识符"b",所以一个局部变量的可行域就是创建它的大括号内。
当我们创建变量的时候,我们最好可以给他一个初始值,这叫做初始化。有时我们不进行初始化的时候程序会报错,所以我们在创建变量的时候尽量进行初始化;
而当我们忘记初始化的时候,会有以下2种情况:一个局部变量不初始化,默认值是随机值;一个全局变量不初始化,默认值是0。
我们可以看到,变量a是一个全局变量,当我没给它初始化的时候,直接打印它的值就是0;而变量b是一个局部变量,当我不初始化时,程序直接报错,这是因为VS编译器太过严格,所以体现不出随机值。
注意:当全局变量与局部变量同名时,局部变量优先。
除法运算符
当除号(/)两边都是整数时,得出的结果也是整数,结果是除之后的商。3/2的结果应该是1.5,但除法运算符得出的是商,3/2商1余1,所以结果是1。
当除号两边有一个及以上个浮点数的时候,得出的结果也是浮点数。浮点数的打印用%f
%f打印浮点数的时候,默认小数点后6位。可以用%.nf来控制打印的小数位数。
取模运算符
取模的符号是%,%的两边必须是整数,取模的结果是两数相除之后的余数。3除2商1余1,故,3%2的结果是1
负数求模的规则是:结果的正负号由第一个操作数的正负号决定。