hello,大家好,我是霜淮子,阅读我的文章学习c语言,作者水平有限,如果发现错误的地方,欢迎大家在评论区留言,万分感谢!
欢迎订阅专栏《c语言程序设计》
目录
前言:
计算机程序的处理对象就是各种数据,数据粗略的可以分为数和符两大类,前者如100、3.14,后者如姓名、数字图像等,计算机中只有数字0和1、为了用这两个数字表示各类数据,为了尽量提高数的表示效率、存储效率,将数据分为不同的数据类型来表示和存储。
5.1、数据类型
c语言有哪些基础数据类型、sizeof可以做什么?
c是有类型的语言
c语言的变量必须
- 在使用前定义,便且
- 确定类型
c以后的语言像两个方向发展:
- c++/java更强调类型,对类型的检查更严格
- javaScript、Python、PHP不看重类型,甚至不需要事先定义
c语言的类型
a)、整数
- char、dhort、int、long、
b)、浮点数
- float、double、
c)、逻辑
- bool
d)、指针
e)、自定义类型
类型有何不同
- 类型名称:int、long、double
- 输入输出时的格式化:%d、%ld、%if
- 所表达数的范围:char<short<int<float<double
- 内存所占据大小:1个字节到16个字节
- 内存中的表达形式:二进制数(补码)、编码
sizeof
是一个运算符,给出某个类型或变量在内存中所占据的字节数
eg:sizeof(int)
sizeof(i)
sizeof是一个静态运算符,它的结果在编译的时刻就决定了
不要在sizeof的括号里面做运算,这些运算是不会做的
5.1.1、整数类型
除了int,还有多少整形类型?
- char:1字节(8比特)
- short:2字节
- int:取决于编译器,通常意义是一个字符
- long:取决于编译器,通常意义是一个字符
- long long:8字节
整数的范围
如何推算整数类型所表达的数的范围,越界了会怎样
数的范围:
对于一个字节(8位),可以表达的是:00000000~11111111
其中:
00000001——>0
11111111~10000000——>-1~-128
00000001~01111111——>1~127
补充:
unsigned
unsigned的初衷并非扩展数能表达的范围,而是为了做纯二进制运算,主要是为了移位
整数的格式化
如何格式化输入输出整数,如何处理8进制和16进制
整数的输入输出
只有两种形式:int 或long long
%d:int
%u:unsigned
%ld:long long
%lu:unsigned long long
8进制和16进制
- 一个数字的字面量是以0开始的就是8进制
- 一个以0X开始的数字字面量是16进制
tips:这只是我们所看到的进制形式,在计算机内并不是这样的
选择数据类型
没有什么特殊需要用int就可以了
选择整数类型
为什么整数有那么多种?
为了准确表达内存,做底层程序的需要
没有特殊需要,就选择int、现在的CPU 的字长普遍是32位或64位,一次内存读写就是一个int。一次计算也是一个int,选择更短的类型不会更快,甚至可能更慢
现代的编译器一般会设计内存对齐,所以更短的类型在实际运用中有可能也占据一个int的大小(虽然sizeof告诉你更小)
unsigned与否只是输出的不同,内部计算是一样的,
5.1.2、浮点类型
double和float,32和64
浮点数的输入输出
浮点的范围与精度
浮点数到底能表示那些数
超过范围的浮点数
printf输出inf表示超过范围的浮点数
printf输出nan表示不存在的浮点数
选择浮点类型
没有特殊需要就选择double
现代CPU能直接对double做硬件运算,性能不会比float差,在64位的机器上,数据存储的速度也不比float慢
5.1.3、字符类型
char是一种整数,也是一种特殊的类型:字符,这是因为:
- 用单引号表示的字符字面量:'a','1'
- ''也是一个字符,
- printf和scanf里用%c来输入和输出字符
5.1.4、逃逸字符
用来表示无法印出来的控制字符或者特殊字符,它由一个反斜杠“\”开头,后面跟上另一个字符,这两个字符符合起来,组成一个字符
#include<bits/stdc++.h>
using namespace std;
int main(){
printf("123\b\n456\n");
return 0;
}
5.1.5、类型转换
自动类型转换
- 当运算符的两边出现不一致的类型时,会自动转换成较大的类型
- 大的意思是能表达的数的范围更大
- 对于printf,任何小于int的类型都会被转换成int;float会被转换成double
- 但是scanf不会,要输入short,需要%hd
强制类型转换
要把一个量强制转换成另一个类型(通常是较小的类型)需要:
(类型)值
比如:
(interesting)32;
只是从那个变量计算出一个新的类型的值,它并不改变那个变量,无论是值还是类型都不会改变。
#include<bits/stdc++.h>
using namespace std;
int main(){
int i =123455;
short s=(short)i;
printf("%d\n",i);
return 0;
}
强制类型转换的优先级高于四则运算、
int i =(int)a/b;
可以试一下这行代码运行的结果是什么。
5.1.6、逻辑类型
表四关系运算和逻辑运算的量
使用bool
#include<stdbool.h>
之后就可以使用bool和true、false
5.2、其他运算:逻辑、条件、逗号
5.2.1、逻辑运算
对逻辑进行与或非的运算
逻辑运算是对逻辑进行的运算,结果只有0或1
逻辑量是关系运算或逻辑运算的结果
例如:
表示数学中的区间。x属于(4,6)
4<x<6
和
x>4&&x<6
优先级
短路
逻辑运算是自左向右进行的,如果左边的结果已经可能决定结果了,就不会做右边的计算。
5.2.2、条件运算和符号运算
- 条件运算符
count=(count>20)?count-10:count+10;
条件、条件满足时的值和条件不满足时的值
- 逗号运算符
逗号用来连接两个表达式,并以其右边的表达式的值作为他的结果,逗号的优先级是所有运算符中最低的,所以它两边的表达式会先计算;逗号的组合关系是自左向右,所以左边的表达式会先计算,而右边的表达式的值就留下来作为逗号运算的结果。
-END-