一.c语言执行流程
1.1 源文件
内容:程序员书写源代码
1.2 目标文件
内容:
- 编译器:源代码转换到目标文件中代码(此时没有绑定任何库)
- 链接器:为目标文件中代码绑定上库
注意:
3. 此过程如果写的代码有错误就会报错
4. 后缀可能为.obj
1.3 可执行文件
内容:最后能成功在目标机器上执行
二.基础
基础标准库函数:
-
printf(“%d”,a) 区别:同python不同,不能直接计算,需要格式化输出才能计算
-
scanf(“%d”,&a)
2.1 区别:同python不同,里面不能写格式化输出提示内容。多个变量写法:scnaf("%d %d",&a,&b)
需要两个%d
之间加上空格;scnaf("%d,%d",&a,&b)
写的时候需要安装a:b
的格式写;scnaf("%d,,%*c,%d",&a,&b)
%*c
表示省掉中间那个字符
2.2 scanf有返回值判断用户输入是否合法
2.3 scanf(一般是针对有%c类型时)时,不能取消空格写如scanf("%d%d%f%c",&a,&b,&c,&d);
;
2.4 scanf()会把空格识别为’\0’,会导致strlen错误 -
gets(str) 获取一个字符串输入
-
puts(str)输出一个字符串,并且自动换行
三.数据类型
原理:举例short a
在64位系统中,由于64位系统有一次计算内容有64字长,故写入二进制前48位都是0,后16位根据写入a的值写入1或者0
基础:不同操作系统和编译器取值不同,32位系统的‘位’也叫‘字长’,一字长=八字节(32字长同一时间内处理字长为32位的二进制数据)
函数:
- typeof(int) 可以查看在当前编译器环境下,字节数
1.整型
原理:根据无符号型和有符号型区分,有符号的需要留一位控制符号,没有的则不需要。数字大小完全是存入的二进制数值计算得出的
实例 | 含义 |
---|---|
short a | 短整型 |
int a | 整型 |
long a | 长整型 |
long long a | 长长整型 |
unsigned int a | 无符号整型 |
unsigned long a | 无符号长整型 |
unsigned long long a | 无符号长长整型 |
类型 | 16位平台 | 32位平台 | 64位平台 |
---|---|---|---|
short | 2个字节 | 2个字节(范围-32768~32767) | 2个字节 |
unsigned short | 2个字节 | 2个字节(范围0~65534)[%u输出] | 2个字节 |
int | 2个字节 | 4个字节(范围-21亿~21亿) | 4个字节 |
unsigned int | 2个字节 | 4个字节(范围0~42亿)[%u输出] | 4个字节 |
long | 4个字节 | 4个字节 | 4个字节 |
long long | 8个字节 | 8个字节 | 8个字节 |
2.浮点型
A:
原理:浮点数在内存中其实是按照IEEE 754(IEEE二进制浮点数算术标准)来存储的,先转换模型,如浮点数a-> a = (-1)^S * M * 2^E(看下图).
其中S如果浮点数为正即0,反之即1,
对于 E,根据其×M=十进制的浮点数,推算出其的值,然后根据,double 和 float 两种类型不同,在此标准中,E 的 类型为 unsigned int
无符号整数类型,但是科学计数法中,指数位可以为负数,所以标准规定 E 存入内存中必须加上一个中间值
float
:E 为 8 位,取值范围为 0 ~ 255
,中间值 127
· · · · · 例:2^10 中 E = 10;保存为 float 类型时,内存中存入的是 10 + 127 = 137 = 10001001
double
:E 为 11 位,取值范围为 0 ~ 2047
,中间值 1023
· · · · · 例:2^10 中 E = 10,保存为 double 类型时,存入的是 10 + 1023 = 1033 = 10000001001
对于 M,先计算把数转换为二进制然后保留一位整数例(2.5->10.1->1.01),只需要存入 M 的小数位,即 若 M = 1.10101,则只需要存入10101
举例:
例如十进制的-5.0,写成二进制是 -101.0 ,相当于 -1.01×2^2 。那么,s=1,M=1.01,E=2+127=129
按float保存后:1 10000001 01000000000000000000000
B:
特点:默认保留6位小数
实例 | 含义 |
---|---|
float | 单精度实例 |
double | 双精度实例 |
long double | 长精度实例 |
3.char型
原理:c语言char类型都是用ASCLL来转换表示计算,也就是数字来计算
注意:需要用单引号
实例 | 含义 |
---|---|
char | 范围-128-127或者0-255(靠编译器的默认) |
signed char | 范围-128-127 |
unsigned char | 范围0-255 |
类型 | 16位平台 | 32位平台 | 64位平台 |
---|---|---|---|
char | 1个字节 | 1个字节 | 1个字节 |
4.字符串型
原理:由多个char组成
定义:char a[20]
表示定义一个字符串长度为20(特别说明:字符串scanf无需‘&’符号)
函数:
- strlen(a) 可以查看a字符串的长度
四.格式化输出
输出原理:实例int a;printf("%hd",a);
在读取存入的的a时因为%hd表示short int
所以它只会读取a存入内存二进制的后16位,设a=2300000
但是输出为6240
是因为%hd
只读取了后16位
4.1格式化表
4.1.1 语法
实例 | 含义 |
---|---|
%5d | 数值长度为5不足补空格,长度足够什么也不补充 |
%-10s | 补充空格往右侧补充 |
%.5f | 保留五位小数 |
%05f | 长度不够全补充0 |
4.1.2 分类
实例 | 含义 |
---|---|
%s | 输出字符串 |
实例 | 含义 |
---|---|
%c | 输出单个字符 |
实例 | 含义 |
---|---|
%f | float类型 |
%lf | double类型 |
%e | float类型和double类型的指数计算浮点数 |
%a | 16进制浮点数 |
实例 | 含义 |
---|---|
%d | 整型 |
%ld | 长整型 |
%lld | 长长整型 |
%hd | 短整型 |
实例 | 含义 |
---|---|
%u | 无符号整型 |
%lu | 无符号长整型 |
%llu | 无符号长长整型 |
%hu | 无符号长长整型 |
实例 | 含义 |
---|---|
%o | 整型八进制 |
%lo | 长整型八进制 |
%llo | 长长整型八进制 |
%so | 短整型八进制 |
实例 | 含义 |
---|---|
%x | 整型十六进制 |
%lx | 长整型十六进制 |
%llx | 长长整型十六进制 |
%hx | 短整型十六进制 |
五.进制转换
其它进制转十进制表示:
int a;a=010
其中a为八进制,输出的内容为十进制(8);int a;a=0xc
其中a为十六进制,输出的内容为十进制(6)'\56'
'\x56'
分别表示八进制56和十六进制56
十进制转其它进制:使用格式化输出(上面)
5.1进制转换
5.1.1任意进制转十进制
注意范围:16进制0-9+a-f(即0-15);8进制0-7.
方法: (数码×权值)然后累加
举例:值(8或16)为57;值1010(二进制)
- 16转10->7×16的0次方+5×16的1次方 = 7+80=87
- 8转10->7×8的0次方 + 5×8的一次方 = 7+40=47
- 2转10->0×2的0次方+1×2的1次方+0×2的2次方+1×2的3次方=0+2+0+8=10
5.1.2 十进制转其它进制
方法:如2进制:每项依次除以二,把余数依次从右先左写出来
举例:值为64
- 转为8进制-> 64÷8余0,8÷8余0,1÷8余1
- 转换为16进制->64÷16余0,4÷16余4
- 转换为2进制->64÷2余0,32÷2余0,16÷2余0,8÷2余0,4÷2余0,2÷2余0,1÷2余1 = 1000000
5.1.3 十进制小数转二进制
方法:规则把小数部分×2-取出整数部分,然后再取出小数部分×2-取出整数部分,依次持续下去,直到值为小数0或形成循环小数则停止(从左到右列出)
举例:
- 值0.25-> 0.25×2=0.5 二进制第一位0;0.5×2=1.0;二进制第二位为1;同时结束
- 值0.8-> 0.8×2=1.6 二进制第一位1;0.6×2=1.2 二进制第二位为1;0.2×2=0.4 二进制第三位为0;0.4×2=0.8 二进制第四位为0;0.8×2=1.6 二进制第五位为1;来到循环结束
六.优先级
举例:
- 结合性
int a,b,c,d;
a = 5;
a=b=c=d;
printf("%d\n%d\n%d\n%d",a,b,c,d);
输出结果一定不是四个五,因为赋值运算符优先级从右向左计算结合
该为 d=5;
就能打印出四个5
- 优先级
int a,b;
a = 2;
b = a + ++a;
printf("%d",b);
结果不是5
结果是6
因为++a优先级高,等到a+ 时a已经是3了
七.运算符号
内容 | 解释 |
---|---|
% | 取余(效果任何数%x的范围都是0-x)a%b的范围0-b |