一、数据类型介绍
C语言提供了不同的数据类型,常见的有整数型类型(用来描述整数),浮点型类型(用来描述小数),字符型类型(用来描述字符)等。它们都有一个共同的特征就是只有编译器知道了数据类型才知道怎么操作数据,以下是数据类型的总览:
1、整型
基本整型为int,在int前面加上不同的修饰符,就可以拓展成不同的类型,例如short int,long int等。在int前面加上signed表示的类型带正负号,在int前面加上unsigned表示该类型不带有正负号,只能表示零和正整数。
//短整型
short [int]
[signed]short [int]
unsigned short [int]
//整型
int
[signed] int
unsigned int
//长整型
long [int]
[signed] long [int]
unsigned long [int]
//更长整型
long long [int]
[signed] long long [int]
unsigned long long [int]
2、字符型类型
字符型变量是用来存放程序中储存使用的字符型数据。
char
//有符号的
[signed] char
//无符号的
unsigned char
3、浮点型
浮点类型可以表示一个小数,其中float表示单精度4字节精度为6位小数;double表示双精度8字节精度为15位小数。
float
double
long double
4、布尔类型
C语言起初并没有为布尔值单独设置一个类型,从C99标准开始,引入布尔类型(“_Bool)。_Bool类型长度唯一,只能取值范围为0或1。将任意非零值赋值给_Bool类型都会先转为1,表示真。将零值赋值给_Bool类型,结果为零,表示假。布尔类型的使用得包含头文件<stdbool.h>,其取值是:true和false。
例子如下:
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool a = true;
printf("a = %d\n", a);
a = -182;
printf("a = %d\n",a);
a = 123;
printf("a = %d\n", a);
a = 0;
printf("a = %d\n", a);
a = NULL;
printf("a = %d\n", a);
return 0;
}
以下为输出结果
5、各种数据类型的长度
每种类型都有自己的长度,使用不同的数据类型可以创造出不同的变量,变量长度不同,储存的数据范围就有所差异。
sizeof操作符
sizeof是关键字,也是操作符,不是函数。是专门用来计算sizeof的操作符数的类型长度,单位是字节。sizeof操作符可以是类型也可以是变量或表达式。
sizeof(类型)
sizeof 表达式
sizeof的操作数不是类型而是表达式的时候可以把括号去掉。
sizeof后边的表达式不是真实参与运算的,根据表达式的类型来得出大小。
sizeof的计算结果是size_t类型的。
数据类型长度
sizeof中表达式不计算
printf("%d\n",sizeof(b = y + 1));//结果等于1,因为编译是,=不被执行
二、signed和unsigned
在C语言中signed和unsigned关键词修饰字符类型和整型类型。signed关键词表示该类型带正负号,包括负号。unsigned关键词表示不带正负号,只能表示零或正整数。unsigned声明变量。unsigned的好处是,同样长度的内存能够表示的最大整数值增大了一倍。
对于int类型默认带正负号的,所以关键字signed可以省略不写。int类型也可以不带正负号,只表示非负整数,这时候就必须使用关键字。
对于char类型,C语言规定默认是否带正负号是由系统决定的。char不等同于signed char,它有可能是signed char也有可能是unsigned char。
三、数据类型的取值范围
每个数据类型都有自己的取值范围,如果我们想查看当前系统上不同的数据类型的极限值:
limits.h这个头文件说明了整数类型的取值范围。
float.h这个头文件说明了浮点数类型的取值范围。
为了代码的可移植性,需要知道某种整数类型的极限值时,应该尽量使⽤这些常量。
• SCHAR_MIN , SCHAR_MAX :signed char 的最小值和最大值。
• SHRT_MIN , SHRT_MAX :short 的最小值和最大值。
• INT_MIN , INT_MAX :int 的最小值和最大值。
• LONG_MIN , LONG_MAX :long 的最小值和最大值。
• LLONG_MIN , LLONG_MAX :long long 的最小值和最大值。
• UCHAR_MAX :unsigned char 的最大值。
• USHRT_MAX :unsigned short 的最大值。
• UINT_MAX :unsigned int 的最大值。
• ULONG_MAX :unsigned long 的最大值。
• ULLONG_MAX :unsigned long long 的最大值。
四、变量
1、变量的创建
C语言中把经常变幻化的值称为变量,不变的值称为常量。
int a ;//整型变量
char b ;//字符变量
float c ;//浮点型变量
变量创建时就给一个初始值,这叫做初始化。
int a = 1;
char b = 'b ';
float c = 3.3;
2、变量的分类
全局变量:在大括号外部定义的变量就是全局变量。
局部变量:在大括号内部定义的变量就是局部变量。(局部变量的使用范围不叫局限,只能在自己所在的局部内使用)
#include <stdio.h>
int a = 1;//全局变量
int main()
{
int b = 2;//局部变量
printf("%d\n",a);
printf("%d\n",b);
return 0;
}
若全局变量和局部变量的名字相同时,局部变量优先使用。
全局变量和局部变量在内存中储存在哪里呢?
C语言内存主要分为一下集中区域:
内存栈区:存放局部变量。
内存堆区:存放new或者malloc出来的对象。
常数区:存放局部变量或者全局变量的值。
静态区:存放全局变量或者静态变量。
代码区:二进制代码。
其实内存区域的划分会更加细致,以后将会介绍。
五、算术操作符
平常我们写代码的时候一定会涉及到计算。C语言为了方便运算提供了一系列的操作符,其中一组操作符叫:算数操作符。其中分别有:+,-,*,/,%,这些操作符都是双目操作符。
1、+ 和 -
+和-用来运算加法和减法
#include <stdio.h>
int main()
{
int a = 10 + 12;
int b = 11 - 9;
printf("%d\n",a);
printf("%d\n",b);
return 0;
}
+和-都是有两个操作数,位于操作符的两侧,这种操作符叫做双目操作符。
2、*
*用来完成乘法运算。
#include <stdio.h>
int main()
{
int a = 2;
printf("%d\n",a * a);
return 0;
}
3、/
/用来运算除法。除法两端如果是整数,执行的是整数除法,结果也是整数。如果像得到浮点数,两个运算数必须有一个浮点数,这是C语言会进行浮点数的除法。
#include <stdio.h>
int main()
{
int a = 9 / 4;
float b = 9 /4;
float c = 9.0 / 4;
printf("%d\n",a); //输出2
printf("%f\n",b); //输出2.000000
printf("%f\n",c); //输出2.250000
return 0
}
再看看下面这个例子:
#include <stdio.h>
int main()
{
int d = 5;
d = (d / 20) * 100;
return 0;
}
上面的代码,眨眼一看会认为d等于25,但实际上d等于0.这是因为d / 20 是整除得到的数是0,要想得到预想的结果可以将20改为20.0,让整除变成浮点数除法。如下图所示:
#include <stdio.h>
int main()
{
int d = 5;
d = (d / 20。0) * 100;
return 0;
}
4、%
运算符%表示求模(余)运算,及返回两个整数相除的余数。这个运算只能运用于整数不能用在浮点数。例子如下:
#include <stdio.h>
int main()
{
int a = 7 % 4;//3
printf("%d\n",a);
return 0;
}
若是负数求模的规则,结果的正负号由第一个运算数的正负号决定。
#include <stdio.h>
int main()
{
printf("%d\n",11 % -5);//1
printf("%d\n",-11 % -5);//-1
printf("%d\n",-11 % 5);//-1
return 0;
}
六、连续赋值
1、连续赋值
操作符是可以连续赋值的,如下图所示
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 3;
c = b = a + 3;//连续赋值,从右到左依次赋值
return 0;
}
虽然说C语言支持这种连续赋值,但是这样在书写会让人很难理解,所以建议还是拆开写来更方便理解。
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 3;
b = a + 3;
c = b;
return 0;
}
2、复合赋值符
我们在写代码的时候,经常可能对一个数进行自增、自减的操作,如下代码:
int a = 1
a = a + 1;
a = a - 2;
故C语言中提供给我们了复合赋值符,这使得我们在写代码的时候更加方便。
int a = 1;
a += 1;
a -= 2;
复合赋值符有以下这些:
(1)+= -=
(2)*= /=
(3)>>= <<=
(4)&= |= ^=
七、单目操作符
前面介绍了双目操作符,在C语言中还有一些操作符只有一个操作数,被称为单目操作符。分别是:++、- -、+(正)、-(负)。
1、++和–
++是一种自增的操作符,其又分为前置++和后置++。–是一种自减的操作符,其又分为前置–和后置–。
//前置++
#include <stdio.h>
int main()
{
int a = 10;
int b = ++a;
printf("a = %d b = %d\n",a,b);//a和b输出结果都为11
return 0;
}
计算口诀:先+1,后使用。
//后置++
#include <stdio.h>
int main()
{
int a = 10;
int b = a++;
printf("a = %d b = %d\n",a,b);//a = 11,b = 10
return 0;
}
计算口诀:先使用,后+1。
***同理可以得出- - ***
2、+和-
这里的+表示正号,-表示负号,都是单目操作符。运算符+对正负值没有影响,是一个可以完全省略掉的运算符,写了也不会报错。运算符-是用来改变正负号的,在负数前面加上-得到一个正数,在正数前面加上-得到一个负数。
八、强制类型转换符
在操作符中还有一种较为特殊的操作符叫做强制操作符。
int a = 3.14;//这个a是double类型的,两边的类型不一样,编译器会报错。
想要消除这个警告我们可以用强制操作符
int a = (int)3.14;//这个就是将3.14强制转化成int类型,只取3.14的整数部分。
在我们写代码的时候尽量避免这样子写,在万不得已的时候再使用。