一, C 语言基础
1. 学习方法
多看 + 多敲 + 多思考总结
2. C 语言历史
机器码: 01 二进制去写代码, 困难很大 10+11 运算
+ ---》 01001
汇编语言: 用助记符替换掉机器码中的序列
+ ---》add
B 语言
1972 年: 设计 unix 系统而发明了 C 语言
3. C 语言中变量类型及其使用
变量: 用来存放各种类型的数据 商品的价格 ---》小数表示 4.0 3.5
商品的数量 ---》整数
商品的名称 ---》中文字符串或者英文字符串
变量类型: int(整型) float(单精度浮点型) double(双精度浮点型) short(短整型) long(长整型)long long int(长长整型) char(字符类型) bool(类型) struct(结构体) union(联合体) enum(枚举) unsigned(无符号数)
变量的使用:
语法规则: 类型 变量名字;
- int ab123;
- float price; // 英文单词, 或者缩写
- float jiage; // 最恶心的
C 语言命名规范:
第一个: 变量的名字中只能有字母, 数字和下划线组成, 并且首字母不能是数字 ab Ab ab78 a79 _abc 7mn(非法) a#b(非法) [email protected](非法)
第二个: 命名的时候尽量通俗易懂, 不要用汉语拼音, 用英文单词缩写
(1) 整型
大小: 4 个字节, 32 位二进制, 知道大小是为了防止使用的时候数据溢出了 (超出取值范围了)
存储:
原码: 一个整数原本的二进制编码
比如: 8 的二进制原码 1000(短除法求)
反码: 把原码依次取反
原码: 1101 --》反码 0010
补码: 反码加 1
原码: 1101 --》补码 0010+1 --》0011
正数在计算机中采用原码存放, 并且最高位是符号位, 0 表示正数, 1 表示负数
1010
负数在计算机中采用补码存放 -88
练习: 熟悉一下短除法, 求各种进制
-1 的二进制是多少
(2) 浮点型
float 占 4 个字节
double 占 8 个字节
小数在计算机中是无法精准存储的
比如: 12.5
12.6
(3)short
2 个字节
long 32 位系统 4 字节 64 位系统 8 字节
long long int 12 字节
(4)char
存放单个字符的 ASCII 码值 占 1 个字节
@ # $ % 'a' 'b' 'c' '1' '6' 8 9 0
美国人制定了 ASCII 码表, 把字符编码成整数
man ASCII 命令可以查看 ASCII 码表
- 'A' -->65
- 'a' -->97
- '0' -->48
- char a='@'; //C 语言规定字符必须用单引号括起来
(5) 布尔类型
bool--》判断真假的, 跟 C 语言的条件判断相配合
注意: 添加 #include <stdbool.h>
只有两个值: true 真 false 假
定义: bool a=true; // 等价于 bool a=1;
bool b=false; // 等价于 bool b=0;
(6) 无符号数
- unsigned int a; // 无符号数 a, 不区分正负, 当成纯粹的数字来计算, 最高位不是符号位了
- unsigned float b;
- unsigned char c;
练习:
第一题:
- char b='b';
- char c=b+5; // 请问 c 是多少
- #include <stdio.h>
- int main()
- {
- char b = 'b';
- char c = b+5;
- printf("C 的 ASCII 值为:%d\n",c);
- printf("C 的符号为:%c\n",c);
- return 0;
- }
结果如下:
第二题:
char a=389; 请问打印 a 的值是多少?? 为什么??
考察数据溢出之后计算机是如何处理的
- #include <stdio.h>
- int main()
- {
- char b = 400;
- char c =300;
- printf("b 的值为:%d\n",b);
- printf("C 的值为:%d\n",c);
- return 0;
- }
结果如下:
b 的值为:-112
C 的值为: 44
原理: 从结果来看, char 类型的变量 a 存放的值溢出了, 系统将溢出的值舍去, 取得小于 256 的数值, 判断是否大于 127, 大于的话先取反码, 再补码即 + 1.
小于 127 的数即本身.
eg:389-256=133; 取反码就是 122, 再补码即为 - 123;
eg:300-256=44; 即为 44.
第三题:
字符跟整数之间的换算
- #include <stdio.h>
- int main()
- {
- char a = '9';
- char b = '5';
- char c = 7;
- printf("The a is %d\n",a-'0');
- printf("The b is %d\n",b-48);
- printf("The c is %c\n",c+'0');
- return 0;
- }
结果如下:
- The a is 9
- The b is 5
- The c is 7
'9' --> 转换成整数 9
'9'-'0' 或者 '9'-48 结果就是整数 9
整数 9 --> 转换成字符'9'
9+'0' 或者 9+48 结果是 57
二, C 语言程序的结构
1. 最简单的 C 语言程序
- #include <stdio.h> // 头文件
- int main() //C 语言程序的入口, main 函数
- {
- printf("hello world!\n"); // 帮助我们在屏幕上打印一句话
- return 0; // 结束整个 main 函数
- }
2. Linux 中编译 C 语言程序
gcc hello.c -o hello
gcc --》Linux 中编译器的名字
-o --》 output 输出
3. Linux 中执行 C 语言程序
./ 程序的名字
三, C 语言的格式控制符号以及输入和输出
1. 格式控制符号
作用: 由于 C 语言区分不同的数据类型, 在输入输出这些数据的时候需要使用不同的格式控制符号来跟变量类型对应
八进制数的标准写法:
int a=10; 二进制 10 --》2
八进制 10 --》8
十六进制 10 --》16
- // int a=b10; // 二进制
- int a=010; // 八进制 10
- int a=0x10; // 十六进制 10
- int a=10; // 十进制的
对应关系:
%d --> int
%f -->float 默认保留 6 位有效数字
- %lf -->double
- %hu -->short
- %ld -->long
- %lld -->long long int
%c -->char 输出的是字符本身
%d -->char 输出是字符的 ASCII 码值
%x --> 十六进制, 字符小写打印
%X --> 十六进制, 字符大写打印
%#x --> 标准形式打印十六进制, 前面加上 0x
%o --> 八进制
%#o --> 标准形式打印八进制, 前面加上 0
%10.2f --> 前面 10 表示位宽不够左边补空格 后面的 2 表示保留 2 个小数位
%-10.2f --> 前面 10 表示位宽 后面的 2 表示保留 2 个小数位
%.9f --》指定了保留 9 个小数位, 位宽没有指定, 默认位宽
%10d -->10 是位宽, 靠右对齐, 左边补空格
%-10d --> 靠左对齐, 右边补空格
%s --> 字符串
%5s
%p --> 变量地址
例如:
- #include <stdio.h>
- #include <stdbool.h>
- int main()
- {
- int a=199;
- float b=96.5;
- double c=89.3;
- short d=45;
- long e=125;
- long long int f=8934;
- char g='@';
- bool h=true;
- printf("a is:%d\n",a);
- printf("a is:%x\n",a);
- printf("a is:%X\n",a);
- printf("a is:%#x\n",a);
- printf("b is:%f\n",b);
- printf("c is:%lf\n",c);
- printf("d is:%hu\n",d);
- printf("e is:%ld\n",e);
- printf("f is:%lld\n",f);
- printf("g is:%c\n",g);
- printf("g is:%d\n",g);
- return 0;
- }
结果如下:
- a is:199
- a is:c7
- a is:C7
- a is:0xc7
- b is:96.500000
- c is:89.300000
- d is:45
- e is:125
- f is:8934
- g is:@
- g is:64
作业:
2 8 10 16 进制之间的相互转换
二进制 --》转换八进制
二进制 --》转换 16 进制
进制之间的转换规则
二进制 --》八进制
二进制 --》十六进制
每三个二进制为一组换算成对应的八进制即可
每四个二进制为一组换算成对应的十六进制即可
八进制取值范围: 0---7 最大的数字 7 换成二进制 111 (421 码)
十六进制取值范围: 0---F 最大的数字 15 换成二进制 1111 (8421 码)
八进制 --》二进制
每个八进制位换算成三个二进制即可
八进制 071 ---》 7 --》二进制 111
1 --》二进制 001 // 不够三位的补零对齐
071--》二进制 111 001
十六进制 --》二进制
每个十六进制位换算成四个二进制即可
十六进制 0A3---》 A --》二进制 1010
3 --》二进制 0011 // 不够四位的补零对齐
0A3--》二进制 1010 0011
八进制 --》十六进制
思路: 先把八进制转成 2 进制, 然后再把 2 进制转成 16 进制即可
八进制 0745 --》二进制 111 100 101 --》16 进制 0001 1110 0101
1 E 5
来源: http://www.bubuko.com/infodetail-3446327.html