淦就完了
一、数据类型
- 基本类型:整型–int、字符型–char、实型(浮点型)–单精度实型float,双精度实型double
- 构造类型–数组类型–[ ],结构类型–struct,联合类型–union,枚举类型–enum
- 指针类型–*
- 空类型(无值类)–void
二、常量
不能改变的量
- 整型,100,0,-10
- 实型,3.12,0.1125,-3.21
- 字符型,‘a’, ‘2’,必须单引号,里面必须有字符
- 字符串型,“a”, “ab”,“1c23”,必须双引号,里面没有字符就是空串
三、变量
代码段在执行时候只读,不可写。
- 匈牙利命名法,见名知意。大驼峰命名法。(自己看自己的代码很容易看不懂)
四、整型数据
1.符号常量
- 下面的sun不能修改,因为#define定义了sun=7,下面相当于7=3 ?,不行吧!!!符号常量不能修改。
2.整型常量的不同进制表示
- 计算机只存储二进制,即0和1,对应物理硬件上是高低电平。
- 一个字节=8位,1位即二进制的1位,存储0或1.
- int型,大小为4个字节,32位。
- 设有二进制数:0100 1100 00111 0001 0101 0110 1111 1110, 其最低位是2的0次方,最高位是2的30次方,最高位是符号位
- 上面对应八进制数:011414253376,它以0开头标识,数位的变化范围是0-7. 二进制转8进制方法:对应的二进制数每三位转换成一位八进制数。实际编程时,识别八进制数时要在前面加0.
- 上面对应十进制数:1278301950
- 上面对应十六进制数0x4C3156FE, 它以0x开头标识。数位变化范围是0-9,A-F,A代表10,F代表15. 对应二进制数每4位转换一位十六进制数。
3.补码
- CPU中只有加法器,无减法器。。。
- 补码=原码按位取反+1
- i=-5;原码:0000 0000 0000 0000 0000 0000 0000 0101
,反码1111 1111 1111 1111 1111 1111 1111 1011,程序中存储:0xff ff ff fb - 2-5相当于2+(-5),即0000 0000 0000 0000 0000 0000 0000 0010+1111 1111 1111 1111 1111 1111 1111 1011,按位相加,得:1111 1111 1111 1111 1111 1111 1111 1101=0xff ff ff fd,即-3(最高位是1,为负,先输出-,再按位取反加一得3,即-3)
- 加一取反,和减一取反一样,在二进制中,二进制特有的属性
4.整型变量
-
缺省的意思就是默认,写与不写都行。
-
-
有符号整型数的第一位(最高位)代表符号位
-
32位的long型是4个字节,64位是8个字节
-
int型占4个字节,最高位是符号位
,就剩下31位了,20–230。 -
Max->全1:0111 1111 1111 1111 1111 1111 1111 1111,1x20+1x21+1x22+…1x230= 231-1 ,21亿多
-
Min–>最大的是-1,最小的原码:1000 0000 0000 0000 0000 0000 0000 0000 ,反码:1111 1111 1111 1111 1111 1111 1111 1111补码:1 000 0000 0000 0000 0000 0000 0000 0000(特殊规定)=-231.负数从1111 1111 1111 1111 1111 1111 1111 1111~1000 0000 0000 0000 0000 0000 0000 0000,即从-1到-231
-
下面是我对这个范围的两个理解:
- 假设int型用两个字节表示
对于有符号的整数,用补码表示的话,最高位是符号位,后面15位用来表示数据.
1.正数,表示的范围为0000 0000 0000 0001-0111 1111 1111 1111,最高位是符号位,不能用于表示数据,所以正数的数值范围为1~32767.
2.0:0000 0000 0000 0000
3.负数,负数的补码是原码取反加1,CPU的加减法运算,是循环进行加减的,即当其由0000 0000 0000 0000加到1111 1111 1111 1111时,如果再加1,就又会为0000 0000 0000 0000了,此时溢出寄存器会置位.而当其由0000 0000 0000 0001减1,即为0000 0000 0000 0000,如果再减1,就会为1111 1111 1111 1111,这就是-1。那么,从0000 0000 0000 0000可以减到什么时候呢?当然是不能与正数的补码重合的,所以可以从1111 1111 1111 1111~1000 0000 0000 0000,即从-1到-32768.
所以,数值范围是-32768~32767.
- 来看原码的正0和负0:0000000000000000和1000000000000000,补码表示中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样变成了0000000000000000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表示2的16次方个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时变成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768。
五、浮点型数据
5.1浮点型常量
- 工作中常用指数,e代表10的幂次
- printf("%f\n",f);
5.2浮点型变量
- float-4个字节,double-8个字节
- 浮点型变量存储,IE-754标准:
六、字符型数据
1.字符型常量
- ''里面只能有一个字符,空格的ASll值为32,可以放空格里面
- char c=65;相当于char c=‘A’
- 字符的输入是一个查表的方式
-
GBK 两个字节
-
A–65,a–97, 0-9:48-57
-
printf(“abc\rd\n”);
-
一开始是abc,后来是dbc,如果是dabc,那就是txt编辑器干的。
-
只要双引号,都是字符串
2.原理
- 把一个字符常量放入字符型变量中,其实是把该字符的ACSCII值放到存储单元。
- 打印时,计算机先从ASCII表中查找字符型变量的ASCII码值,查到后会显示对应的字符。%c–字符,%d–ASCII值
- 对于字符型变量,无论赋的是ASCII码值还是字符,或是运算,只要%c,打印出来的都是字符,使用%d打印输出的都是ASCII值
七、字符串常量
- "" 里面啥都没有也是字符串常量,空字符串
- 没有关键字定义
- 不能将字符串型常量赋给字符型变量
八、混合运算
- 数值按int型(默认4个字节)运算
- 浮点型常量按double型(默认8个字节)运算,
- 5/2=2,5/2.0=2.500000
九. 常用的输入/输出函数
1.scanf函数的原理
- 任何在缓冲区里的东西都是字符,scanf会转换显示在屏幕上
- 我们输入的字符先放到换缓冲区中,回车换行时才进行实际的I/O操作
- \n也是字符
-
scanf %f %d发现有\n 空格,会忽略(行缓冲)
-
scanf %c 不忽略
-
\n 缓冲区刷新
2.scanf的循环读取
- scanf()的返回值时输入成功的数量
- EOF=-1
while(scanf("%d",&i)!=EOF)//正确输入2:1!=-1,逻辑对的,继续循环
{
//ctrl+z:0!=-1,进入循环,运行完再进行判断
|2\na\n| //输入a的时候,不匹配,打印一个3,此时缓冲区还是有2a\3
printf("3\n",i);
}
- 因此需要输入一次scanf(),再刷新一次scanf()缓冲区
- fflush(stdin)都是windows下,清除缓冲区
- 2017-2019用:rewind(stdin)
这下会卡住:
正确的方法:
3. 多种数据类型混合输入
- 读取字符时,不会忽略空格和’\n’(回车符),因此要在%c前加一个空格
- scanf("%d %c%f",&a,&b,&c)
4.getchar函数
- 每次只读一个字符
5.printf函数
- %-5.2f,至少显示5位,且2位小数,左对齐
- %03d,占3位,不足补0
10.运算符与表达式
- 0代表假,非0即为真
左移是乘2
- 后加加,先去掉++,再运算,分两步
- 前加加,按照优先级