C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型
1.0数据类型
1.1整数类型
1.2浮点类型
1.3逻辑类型
1.4类型转换和条件运算
1.0数据类型
1 整数
char(%c), short, int(%d), long(%ld), long long(C99)
2 浮点数
float(%f), double(%lf), long double(C99)
3 逻辑
bool(C99)
4 指针
5 自定义类型
所表达的数的范围:char<short<int<float<double
sizeof是静态运算符,它的结果在编译时刻就决定了
不要在sizeof的括号里做运算,这些运算不会做的
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 5 main() 6 { 7 int a = 6; 8 9 printf("sizeof(int)=%d ", sizeof(int)); 10 11 printf("sizeof(a)=%d ", sizeof(a++));//sizeof是静态运算符,它的结果在编译时刻就决定了 12 //不要在sizeof的括号里做运算,这些运算不会做的 13 14 printf("a=%d ", a);//仍然是6 15 16 printf("sizeof(a)=%d ", sizeof(a + 1.0));//8,变成double 17 18 printf("a=%d ", a);//仍然是6 19 20 system("pause"); 21 }
1.1整数类型
整数
char:1字节,8比特:-128~127
short:2字节:-32768~32767
int:取决于编译器CPU,通常的意义是1个字
long:取决于编译器CPU,通常的意义是1个字
long long:8字节
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 5 main() 6 { 7 printf("sizeof(char)=%d ", sizeof(char)); 8 9 printf("sizeof(short)=%d ", sizeof(short)); 10 11 printf("sizeof(int)=%d ", sizeof(int)); 12 13 printf("sizeof(long)=%d ", sizeof(long)); 14 15 printf("sizeof(long long)=%d ", sizeof(long long)); 16 17 system("pause"); 18 }
sizeof(char)=1
sizeof(short)=2
sizeof(int)=4
sizeof(long)=4
sizeof(long long)=8
请按任意键继续. . .
整数的范围
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<limits.h> 5 6 main() 7 { 8 char c = 255; 9 int i = 255; 10 11 printf("c=%d,i=%d ", c, i);//char超出范围,所以显示-1 12 13 printf("%d,%d ", CHAR_MAX, CHAR_MIN);//127 -128 14 15 system("pause"); 16 }
补码
0000 0001(1)+1111 1111(-1)=(1)0000 0000
1111 1111被当作纯二进制看待时,是255,被当作补码看待时是-1
同理,对于-a,其补码就是0-a,实际是2^n-a,n是这种类型的位数
unsigned
如果一个字面量常数想要表达自己是unsigned,可以在后面加u或U
255U
用l或L表示long(long)
unsigend的初衷并非拓展数能表达的范围,而是为了做纯二进制运算,主要为了移位
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<limits.h> 5 6 main() 7 { 8 unsigned char c = 255; 9 int i = 255; 10 11 printf("c=%d,i=%d ", c, i); 12 13 printf("%d ", UCHAR_MAX);//255 14 15 system("pause"); 16 }
整数越界
整数是以纯二进制方式进行计算的,所以:
1111 1111+1->1 0000 0000->0
0111 1111+1->1000 0000->-128
1000 0000+1->0111 1111->127
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 5 main() 6 { 7 char c = 127; 8 9 printf("c=%d ", c);//127 10 11 c = c + 1; 12 13 printf("c=%d ", c);//-128 14 15 c = -128; 16 17 printf("c=%d ", c);//-128 18 19 c = c - 1; 20 21 printf("c=%d ", c);//127 22 23 unsigned char ch = 127; 24 25 printf("ch=%d ", ch);//127 26 27 ch = ch + 1; 28 29 printf("ch=%d ", ch);//128 30 31 ch = 255; 32 33 printf("ch=%d ", ch);//255 34 35 ch = ch + 1; 36 37 printf("ch=%d ", ch);//0 38 39 system("pause"); 40 }
画图,char,unsigned char的范围
整数的输入输出
只有两种类型:int或long long
%d:int
%u:unsigned
%ld:long long
%lu:unsigned long long
如果没有特殊需要,只使用int
1.2浮点类型
如果没有特殊需要,只使用double
1.3逻辑类型
!age<20;
等价于(!age)<20;
永远是1
!done && count > MAX;
等价于(!done) && (count > MAX);
短路
逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算
不要把赋值,包括复合赋值组合进表达式!
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 5 main() 6 { 7 int a = -1; 8 9 if (a > 0 && a++ > 1) 10 { 11 printf("ok "); 12 } 13 14 printf("%d ", a);//仍然是-1,短路 15 16 system("pause"); 17 }
1.4类型转换和条件运算
当运算符的两边出现不一致的类型时,会自动转换成较大的类型
大的意思是能表达的数的范围更大
char->short->int->long->long long
int->float->double
自动类型转换
对曰printf,任何小于int的类型会被转换成int;float会被转换成double
但是scanf不会,要输入short,需要%hd
强制类型转换
要把一个量强制转换成另一个类型(通常是较小的类型),需要
(类型)值
(int)10.2
(short)32
注意这时候的安全性,小的变量不总能表达大的量
(short)32768越界
强制类型转换只是从那个变量计算出了一个新的类型的值,它并不改变那个变量,无论是值还是类型都不改变
强制类型转换的优先级高于四则运算