C语言学习笔记
C语言学习笔记此文章为个人学习时记录笔记,顺便试试MarkDown,不是教程~。
Mac系统的使用
-
Finder 文件管理系统
-
Dock 快捷栏
-
系统偏好设置
-
Safari浏览器
-
App Store
常用快捷键
指令 | 作用 |
---|---|
CMD + 空格 | 切换输入法 |
CMD + C | 拷贝 |
CMD + V | 粘贴 |
CMD + A | 全选 |
CMD + S | 保存 |
CMD + X | 剪切 |
CMD + Tab | 切换应用程序 |
CMD + F | 查找 |
CMD + N | 新建 |
CMD + Shift + 3 | 截全屏 |
CMD + Shift + 4 | 截选中部分 |
CMD + Z | 撤销 |
CMD + Shift + Z | 恢复撤销 |
终端常用命令
命令 | 作用 |
---|---|
ls | 显示当前目录下的子目录 |
pwd | 查看当前路径 |
cd 子目录名 | 进入当前子目录(有空格!) |
cd.. | 返回上一级目录 |
clear/ctrl+l | 清屏 |
tab | 自动补齐 |
touch test.txt | 新建文件 test.text |
open test.txt | 打开文件 test.txt |
rm test.txt | 删除文件 test.txt |
mkdir test | 新建目录 test |
rmdir test | 删除目录 |
rm -rf test | 删除文件或目录 test |
练习:
在桌面通过命令新建一个目录。进入到该目录,在目录里新建一个文件,打开文件,写入一句话,关闭文件,删除整个目录,包括里面的文件。
进制转换
引入二进制的原因 计算机是以二进制的形式进行数据存储的,因为二进制存储简单。
引入八进制和十六进制的原因 八进制和十六进制能更好的表示二进制。
二进制- >十进制
二进制:用0,1来表示所有的自然数
十进制:用0~9来表示所有的自然数
八进制:用0 ~ 7来表示所有的自然数
十六进制:用0--9,a—f来表示所有的自然数
规律 任何一个二进制数,从右向左依次数起,分别为第0位,第1位,第2位......,找到所有的数值为1的位数,用2的位数次方依次相加,得到十进制结果。
11001(2) = 25(10)
十进制- >二进制
倒除法
45(10) = 101101(2)
98(10) = 1100010(2)
123(10) = 1111011(2)
八进制- >二进制
三位一取:每1位8进制数用3位2进制数来表示。
54(8) = 101 100(2)
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
十六进制- >二进制
四位一取 : (高位的0可以省略)
2d (16) = 0010 1101(2) = 101101(2)
二进制- >八进制
三位一取
1011(2) = 001 011(2) = 13(8)
二进制- >十六进制
四位一取 : 从低位向高位数
101101(2) = 0010 1101 = 2d(16)
原码 补码 反码
真值:一个数的十进制表示形式
机器数:一个数的二进制表示形式
原码
由符号位和机器数组成,最高位表示符号位。1表示负数,0表示正数;其余位数用真值的绝对值得二进制表示。
真值 | 源码 |
---|---|
1(10) | 0 000 0001(2) |
-1(10) | 1 000 0001(2) |
结论 计算机不以原码的方式进行数据存储,因为原码会出现计算错误。
反码
正数的反码是原码,附属的反码是原码的符号位不变,其余位数按位取反(0变1,1变0);反码的反码是原码。
1
0 000 0001 原码 0 000 0001 反码
0 000 0001 反码 1 111 1110 反码
-1
1 000 0001 原码 1 111 1111 反码
1 111 1110 反码 1 000 0000 原码
-0 真值
结论 计算机不以反码的方式进行数据存储,因为反码解决不了0的问题。
补码
正数的补码是原码,负数的补码是反码+1;补码的补码是原码。
1
0 000 0001 原码
0 000 0001 反码 0 000 0001 补码
0 000 0001 补码 1 111 1111 补码
-1 +
1 000 0001 原码 0 000 0000 补码
1 111 1110 反码 0 000 0000 原码
1 111 1111 补码
0 真值
结论 计算机是以补码的形式进行数据存储的。
内存大小
内存是由大量开关组成的,每个开关有两种状态,0表示关,1表示开,每个开关只能存储一个值,用1bit表示。
一个字节存储范围是:-128 ~ 127
1byte(字节)=8bit
1kb=1024byte
1Mb=1024kb
1Gb=1024Mb
1Tb=1024Gb
注意 计算机分配内存的最小单位是字节。
终端
命令模式
编辑模式
VI编辑器
用来编辑C代码(C源文件后缀是 .c)
- 新建或打开.C源文件
vi test.c - 从命令模式切换到编辑模式
i - 退出编辑模式,返回命令模式
ESC - 保存并返回
:wq - 编译代码(将.c源文件编译成可执行文件)
gcc test.c -o t - 运行可执行文件
./t
变量与常量
变量:值可以改变的量
常量:值不可以改变的量
定义变量
数据类型 变量名;
常见的数据类型
整形
类型 | 16位系统 | 32位系统 | 64位系统 |
---|---|---|---|
short(短整形) | 2字节 | 2字节 | 2字节 |
int(整形) | 2字节 | 4字节 | 4字节 |
long(长整形) | 4字节 | 4字节 | 8字节 |
无符号的(unsigned)
unsigned int a = 3;
unsigned short b;
浮点型
float //(单精度)小数点后3-6位 4字节
double //(双精度)小数点后13-16位 8字节
字符型
char 1字节
变量名
标示符:只能由数字、字母、下划线组成,但是不能以数字开头(不能以关键字命名)
变量名遵循标示符的命名规则
int a;
int //数据类型
a //变量名
; //语句结束符
变量的赋值
a=4;
a //变量名
= //赋值运算符
4 //常量
变量的初始化
int a = 3;
```c
printf("hello world"); //屏幕上显示hello world
printf("%d",a); //屏幕输出变量a的值
常用的格式符
%d 十进制整形
%f 浮点型
%c 字符型
%ld 十进制长整形
%lf double
%.2f 保留小数点后两位(四舍五入)
%.2d 保留两位整数
%o 八进制整型
%0x 十六进制整型
\n 换行
整数的表示形式
十进制(默认)20
八进制 020
十六进制 0x20
字符型
char c;
c = ‘A’;
c //字符型变量
‘A’ //字符型常量
【注】字符型 常量是由一对 单引号 括起来。
ASCII码
字符常量的十进制表达形式。
‘0’ 48
‘A’ 65
‘a’ 97
转义字符
本身并不会显示,但是具有特殊意义的一类字符(一般用在printf里)
\n //换行
\t //tab
\r //回车不换行(覆盖)
\ //打印 \
%% //打印 %
运算符
算术运算符
+加法运算符 - 减法运算符
*乘法运算符 / 除法运算符
%模运算符(求余运算符) 5%8=5 8%5=3
相同数据类型变量做算术运算,结果类型不变;如果是两个整数做除法运算,结果仍然是整数,小数部分被舍弃(不四舍五入)
不同数据类型变量做算数运算,遵循以下规则:
- 整形向浮点型看齐
- 单精度向双精度看齐
- 短字节向长字节看齐
- 有符号向无符号看齐
强制转换运算符(不建议使用)
(数据类型)表达式
float a = 3.14;
int
a=(int)f;
注 强转之后,f本身值不发生变化。
float a = 3.14;
float b = 4.1;
int c = (int)(a + b);
自增运算符
结果:变量的值自加1
变量++:先使用,后+1
++变量:先+1,后使用
int a; int a;
int i=5; int i=5;
a=i++; a=++i;
//结果:a=5,i=6 a=6,i=6
自减运算符
结果:变量的值自减1
变量++: 先使用,后-1
++变量: 先-1,后使用
关系运算符
> //大于
< //小于
== //等于
!= //不等于
>= //大于等于
<= //小于等于
- ==与=的区别
- 关系运算符主要用于条件语句中
- 关系表达式的值,只有真和假两种结果,如果为真则值为1,如果为假,则值为0。
逻辑运算符
&& //逻辑与
|| //逻辑或
! //逻辑非
- 逻辑与(&&)
逻辑与的表达式可以有无数个。
表达式1 | 表达式2 | 逻辑与 |
---|---|---|
真 | 真 | 真 |
真 | 假 | 假 |
假 | 真 | 假 |
假 | 假 | 假 |
值 只要有一个为假,结果为假。
- 逻辑或(||)
逻辑或的表达式可以有无数个。
表达式1 | 表达式2 | 逻辑与 |
---|---|---|
真 | 真 | 真 |
真 | 假 | 真 |
假 | 真 | 真 |
假 | 假 | 假 |
值 只要有一个为真,结果为真。
- 逻辑非(!)
表达式 | 逻辑非 |
---|---|
假 | 真 |
真 | 假 |
值 非零为真,零为假。
复合运算符
+=、-=、*=、/=
a+=b; => a=a+b;
a*=b+3; => a=a*(b+3);
逗号运算符
表达式1,表达式2,表达式3,......,表达式n;
执行过程
- 每个表达式依次执行一遍。
返回值
- 返回最后一个表达式的值。
条件运算符
表达式1 ? 表达式2 : 表达式3;
注 条件运算符是唯一的一个三目运算符
执行过程
-
先判断表达式1的值
-
如果表达式1的值为真,那么执行表达式2,不执行表达式3;
-
如果表达式1的值为假,那么执行表达式3,不执行表达式2。
返回值
-
先判断表达式1的值
-
如果表达式1的值为真,那么返回表达式2的值
-
如果表达式1的值为假,那么返回表达式3的值。
int i=2;
int j=2;
3>2 ? i++ : j++;
格式化输入输出
printf(“%d”,a); //格式化输出
scanf(“%d”,&a); //格式化输入
条件语句
if else
如果。。。。那么。。。。
if(表达式)
{
//语句;
}
执行过程:
-
如果有表达式的值为真,那么执行语句
-
否则,跳过if,继续向后执行。
如果。。。。那么。。。。否则。。。。
if(表达式)
{
//语句;
}
else
{
//语句2;
}
执行过程
- 如果有表达式的值为真,那么执行语句1
- 如果有表达式的值为假,那么执行语句2。
switch case
switch(表达式)
{
case 常量1:
//语句1;
break;
case 常量2:
//语句2;
break;
case 常量3:
//语句3;
break;
...
case 常量n:
//语句n;
break;
default:
}
注
- case分支可以有无数个
- default分支可有可无
- break必须写,用来跳出switch语句
- case后面跟的是常量
循环语句
while
while(表达式)
{
//语句;
}
执行过程
- 当程序执行到while循环式,先判断表达式的值
- 如果表达式的值为真,那么执行循环体语句
- 然后再判断表达式的值,如果仍然为真,继续执行循环体语句
- 直到表达式的值为假,循环结束。
注意
- 问题需要有规律,才可以使用循环
- 需要有能使循环终止的条件
- 需要有使循环执行的循环变量
do while
do
{
语句;
}while(表达式);
for
for (语句1;表达式;语句3){
//语句2;
}
执行过程
- 先执行语句1,判断表达式的值
- 如果表达式的值为真,那么执行语句2,执行语句3
- 再判断表达式的值,如果仍然为真,继续执行语句2,执行语句3
- 再判断表达式的值,知道表达式的值为假,循环终止。
continue:结束本次循环,继续下一次循环;
注 当程序遇到continue时,continue后面的语句就不会被执行了,继续去循环下一次。
break:用来终止循环(可以使用在任何循环中)。