数据类型
廖家龙 用心听,不照做

C数据类型、格式控制符整理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
C数据类型:

1⃣️基本数据类型:
整型:char、short、int、long、long long(C99)
浮点型:float、double、long double(C99)
布尔型:bool(C99)

1)char:字符类型,一个字节(一个字节=八个比特),-128~+127
2)short:短整型,通常为16位,两个字节,-32768~32767
3)int:取值范围取决于具体的机器,通常代表特定机器中整数的自然长度,通常为16位,其取值范围在-2147483648 ~ +2147483647之间,也有用32位表示的int类型
4)long:长整型,四个字节,至少占32位存储单元,在某些机器上int与long类型的长度相同
5)long long:八个字节
6)float类型:取值范围取决于具体的机器,通常是32位,可以存储有效位数不超过7位的小数,取值范围一般在10^(-38)~10^(+38)之间
7)double:双精度浮点型,64位,可以存储有效位数不超过16位的小数

2⃣️构造类型:数组、结构体、枚举

3⃣️指针类型

4⃣️空类型:void

5⃣️typedef自定义类型

C格式控制符:不同类型的数据在变量中存储的形式是不一样的,所以在读取变量中的数据的时候,类型不同读取的方式也不同

%hd:short

%d:读取int整型,以十进制输出
%o:读取int整型,以八进制输出(一个以0开始的数字字面量是8进制)
%x:读取int整型,以十六进制输出(一个以0x开始的数字字面量是16进制,8进制和16进制只是如何把数字表达为字符串,与内部如何表达数字无关)

%ld:long
%lld:long long

%hu:unsigned short
%u:unsigned int
%lu:unsigned long
%llu:unsigned long long

float和double类型的printf都使用%f或%e,float的scanf使用%f,double的scanf使用%lf

%c:char类型,表示字符
%s表示字符串

%p:地址

%%表示百分号(%)本身

数据类型的一些注意点

  1. 一个C语言程序,无论其大小如何,都是由函数和变量组成的,函数中包含一些语句,以指定所要执行的计算操作;变量则用于存储计算过程中使用的值。main是一个特殊的函数名,每个程序都从main函数的起点开始执行,每个程序都必须在某个位置包含一个main函数;函数之间进行数据交换的一种方法是调用函数向被调用函数提供一个值(称为参数)列表

  2. 变量的命名规则:变量名是由字母和数字组成的序列,但其第一个字符必须为字母,下划线“_”被看作是字母,通常用于命名较长的变量名,以提高其可读性。由于库例程的名字通常以下划线开头,因此变量名不要以下划线开头

  3. 变量就是内存中开辟的用来存储数据的那块空间,所以变量是用来存储数据的,我们声明一个变量,如果没有为这个变量赋值,这个变量是有值的,这个值是一个随机数、垃圾值

  4. 在同一个大括弧中不允许定义多个变量名相同的变量,不同大括弧可以

  5. 自动类型转换:当我们为变量赋值的时候,如果赋值的数据的类型和变量的类型不一致,这时候C系统会将赋值的数据的类型转换为变量的类型再赋值

如果某个算术运算符的所有操作数均为整型,则执行整型运算。但是,如果某个算术运算符有一个浮点型操作数和一个整型操作数,则在开始运算之前整型操作数将会被转换为浮点型

强制类型转换:要把一个量强制转换成另一个类型(通常是较小的类型):(int)10.2,注意这时候的安全性,小的变量不总能表达大的量:(short)32768

强制类型转换只是从那个变量计算出了一个新的类型的值,它并不改变那个变量,无论是值还是类型都不改变

强制类型转换的优先级高于四则运算:

1
2
3
double a=1.0;
double b=2.0;
int I=(int)a/b;
  1. 在printf函数的参数中,只能用\n表示换行符,如果用程序的换行代替\n,C编译器将会产生一条错误信息。printf函数永远不会自动换行,这样我们可以多次调用该函数以分阶段得到一个长的输出行。

  2. printf函数并不是C语言本身的一部分,C语言本身并没有定义输入/输出功能。printf仅仅是标准库函数中一个有用的函数而已,这些标准库函数在C语言程序中通常都可以使用。

  3. printf输出inf表示超过范围的浮点数,printf输出nan表示不存在的浮点数

  4. scanf函数是一个阻塞式的函数,当CPU执行到这个函数的时候,CPU的执行就会暂停,不会继续往下执行了,并等待用户输入数据

  5. scanf函数后面不要加\n

  6. 如果没有特殊需要,只使用double,现代CPU能直接对double做硬件运算,性能不会比float差,在64位的机器上,数据存储的速度也不比float慢

  7. #include<stdbool.h>之后就可以使用bool和true、false了

  8. 在C语言中如果我们直接写一个小数,那么这个小数的类型是double类型的,如果我们就是希望这个小数是一个float类型的,那么就在这个小数的后面加一个f/F

  9. char类型的变量中只能存储单个字符,并且这单个字符还要用单引号引起来;如果char类型的变量中存储的字符超过一个,那么它只会保存最后一个字符(char变量中可以存储一个空格,无法存储中文,因为在C语言中,一个中文占3个字节)

  10. 字符型变量是用来存储字符常量的变量。将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值(无符号整数)存储到内存单元中。【‘A’——65、‘a’——97、‘0’——48,为char变量赋值的时候可以直接赋值ASCII码】

  11. 所有整型都包括signed(带符号)和unsigned(无符号)两种形式,且可以表示无符号常量与十六进制字符常量;

unsigned类型的数总是正值或0,如果char对象占用8位,那么unsigned char类型变量的取值范围为0~255,而signed char类型变量的取值范围则为-128~127(在采用对二的补码的机器上)

如果一个字面量常数想要表达自己是unsigned,可以在后面加U【255U】,用l或L表示long(long)

unsigned的初衷并非扩展数能表达的范围,而是为了做纯二进制运算,主要是为了移位

17.
无论是float还是double,默认都只显示小数点后6位(不足的用0补齐,多余六位的只保留六位)
%.nf:表示显示小数点后n位
%m.nf:如果变量整体的位数(小数点默认显示n位,无n的默认显示6位,小数点不足6位的在后面补0,大于6位的按6位计算)小于m,不足的地方就会以空格补齐(正数在前面补齐,负数在后面补齐);如果变量整体的位数大于字符宽,那么实际有多少位就显示多少位(%0mf,不足的地方以0补齐)