C语言提供了丰富的数据类型来描述生活中的各种数据。使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。
所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据。
以下为C语言提供的各种数据类型,主要探讨内置数据类型哦。
char
[signed] char //有符号的
unsigned char //⽆符号的
//短整型
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]
float
double
long double
C语言原来没有为布尔值单独设置一个类型,而是使用整数 0 表示假,非零值表示真。 C99 中引入布尔类型 ,专门表示真假。
_Bool
布尔类型的使用得包含头文件
布尔类型变量的取值是: true 或者 false .
1.5 各种数据类型的长度
每种数据类型都有自己的长度,不同的数据类型,能创建出长度不同的变量,变量长度的不同,存储的数据范围就有所差异。
sizeof 是一个关键字,也是操作符,专门是用来计算sizeof的操作符数的类型长度的,单位是字节。
sizeof 操作符的操作数可以是类型,也可是变量或者表达式。
sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。
sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出大小。
sizeof 的计算结果是 size_t 类型的。
//VS2022 X64配置下
printf("%zd\n", sizeof(char));//1
printf("%zd\n", sizeof(_Bool));//1
printf("%zd\n", sizeof(short));//2
printf("%zd\n", sizeof(int));//4
printf("%zd\n", sizeof(long));//4
printf("%zd\n", sizeof(long long));//8
printf("%zd\n", sizeof(float));//4
printf("%zd\n", sizeof(double));//8
printf("%zd\n", sizeof(long double));//8
#include
int main()
{
short s = 2;
int b = 10;
printf("%d\n", sizeof(s = b+1));//表达式不计算,s是short int类型,打印出2
printf("s = %d\n", s);
return 0;
}
C语言使用 signed 和 unsigned 关键字修饰字符型和整型类型的。
signed 关键字,表示一个类型带有正负号,包含负值;
unsigned 关键字,表示该类型不带有正负号,只能表示零和正整数。
对于 int 类型,默认是带有正负号的,也就是说 int 等同于 signed int 。由于这是默认情况,关键字 signed 一般都省略不写,但是写了也不算错。
类型是用来创建变量的。C语言中把经常变化的值称为变量,不变的值称为常量。
变量创建的语法形式
数据类型+变量名
int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量
在创建变量的时候给一个初始值,就叫变量的初始化。
• 全局变量:在大括号外部定义的变量就是全局变量
全局变量的使用范围更广,整个工程中想使用,都是有办法使用的。
• 局部变量:在大括号内部定义的变量就是局部变量
局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的。
当局部变量和全局变量同名的时候,局部变量优先使用。
在学习C/C++语言的时候,我们会关注内存中的三个区域:栈区、堆区、静态区。
1. 局部变量是放在内存的栈区。
2. 全局变量是放在内存的静态区。
3. 堆区是用来动态内存管理的。
这些操作符都是双目操作符。
注:操作符也被叫做:运算符
双目操作符都是有2个操作数的,位于操作符两端的就是它们的操作数。
使用 ' / ' 时若希望得到浮点数的结果,两个运算数必须有一个浮点数,这时就会进行浮点数除法。 如6 / 4 得到的结果是 1.0 ,而不是1.5 。原因就在于C语言里面的整数除法是整除,只会返回整数部分,丢弃小数部分。若想让结果为1.5,则需将表达式改为 6.0 / 4 或 6 / 4.0。
' % ' 这个运算符只能用于整数,不能用于浮点数。表示求模运算,结果为两个整数相除的余数。其中负数求模的规则是,结果的正负号由第一个运算数的正负号决定。
' = ' 可以用于给刚创建的变量赋值。其中连续赋值是从右向左依次赋值,在这里不推荐连续赋值,不好观察细节。
复合赋值符
+= -=
*= /= %=
>>= <<=
&= |= ^=
++ 和 --
++是一种自增的操作符,又分为前置++和后置++,--是一种自减的操作符,也分为前置--和后置--
前置++ 计算口诀:先+1,后使用;
后置++ 计算口诀:先使用,后+1
前置-- 计算口诀:先-1,后使用
后置-- 计算口诀:先使用,后-1
int a = 3.14;
//a的是int类型, 3.14是double类型,两边的类型不一致,编译器会报警告
为了消除这个警告,我们可以使用强制类型转换:
int a = (int)3.14; //意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分
printf() 的作用是将参数文本输出到屏幕。printf() 不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。为了让光标移到下一行的开头,可以在输出文本的结尾,添加一个换行符 \n 。
printf() 使用之前,必须在源码文件头部引入头文件 stdio.h 。
所谓“占位符”,就是这个位置可以用其他值代入。
输出文本里面可以使用多个占位符。
printf() 参数与占位符是一一对应关系,如果有 n 个占位符, printf() 的参数就应该有 n +1 个。如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值。
%a :十六进制浮点数,字母输出为小写。
%A :十六进制浮点数,字母输出为大写。
%c :字符。
%d :⼗进制整数。
%e :使用科学计数法的浮点数,指数部分的 e 为小写。
%E :使用科学计数法的浮点数,指数部分的 E 为大写。
%i :整数,基本等同于 %d 。
%f :小数(包含 float 类型和 double 类型)。
%g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会自动转为科学计数法,指数部分的 e
为小写。
%G :等同于 %g ,唯⼀的区别是指数部分的 E 为大写。
%hd :十进制 short int 类型。
%ho :八进制 short int 类型。
%hx :十六进制 short int 类型。
%hu :unsigned short int 类型。
%ld :十进制 long int 类型。
%lo :八进制 long int 类型。
%lx :十六进制 long int 类型。
%lu :unsigned long int 类型。
%lld :十进制 long long int 类型。
%llo :八进制 long long int 类型。
%llx :十六进制 long long int 类型。
%llu :unsigned long long int 类型。
%Le :科学计数法表示的 long double 类型浮点数。
%Lf :long double 类型浮点数。
%n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
%o :八进制整数。
%p :指针。
%s :字符串。
%u :无符号整数(unsigned int)。
%x :十六进制整数。
%zd : size_t 类型。
%% :输出⼀个百分号。
%5d 表示这个占位符的宽度至少为5位。如果不满5位,对应的值的前面会添加空格。输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成左对齐,在输出内容后面添加空格,可以在占位符的 % 的后面插入一个 - 号。
限定小数位数:
希望小数点后面只保留两位,占位符可以写成 %.2f 。