目录
一、Linux操作指令
1、Linux常用命令
用户切换
普通用户----超级用户 sudo su
超级用户---普通用户 exit
su + username
临时获取超级用户权限
sudo + 命令
sudo apt install 软件名
ls 查看当前目录下有哪些文件或者文件夹
ls -a:显示所有文件包含隐藏文件(以.开头的文件就是隐藏文件)
ls -r:逆向显示文件
ls -R:递归地列举所有目录(在当前目录下)的所有内容
ls -l:详细显示文件属性
pwd:查看当前目录的完整路径
创建目录/文件
创建一个空目录 --- mkdir test1
先创建子目录1再在子目录1下创建子目录2 --- mkdir -p test1/test2
touch:创建文件
touch day2.txt
touch main.c main.cpp main.java main.py main.js
如果文件不存在,创建文件,如果文件存在,则修改该文件的时间戳为当前时间
touch -t 时间 文件名:修改文件的时间戳为指定时间。
删除目录/文件
rmdir: 删除空文件夹/目录
(注意: rmdir只能删除空文件夹/目录) ------ rmdir test1
rm:删除文件或非空文件夹/目录
rm + 文件名
rm -r + 文件夹/目录名 或者 rm -rf +文件夹/ 目录名
移动文件
mv day2 day3 --- 将day2文件夹移动到day3文件夹
mv day2.txt day3 --- 将day2.txt移动到day3文件夹
重命名文件
mv day2.txt day3.txt ---- 把day2.txt改为day3.txt
mv day2 day3 ---- 把day2文件夹名改为day3
cp: 拷贝文件
-
拷贝文件
cp test1.c day2 --- 把test1.c拷贝到day2中
-
拷贝文件夹
cp -r dir1 dir2 --- 把文件夹dir1拷贝到dir2中
man:查看帮助文档
cat:查看文件内容----cat test.c
查看ip地址
windows:打开终端 输入 ipconfig
Linux:打开终端,在终端中输入 ifconfig
vi/vim复制剪切粘贴操作
[1] 按行复制/剪切命令----yy/dd,表示按行复制/剪切;
[2] 对光标位置到该行的结尾进行复制/剪切
命令y$/d$,表示从当前光标复制/剪切到当前光标结尾
[3] 多行复制命令----nyy/ndd
[4] 粘贴操作----命令p/P。
[5] 错误撤销恢复----命令u表示撤销,如果想取消撤销,可以按ctrl+r恢复
底行模式
[1] 保存操作:
:w 直接保存到原始文件中
:wq 表示写入退出命令
:q! 表示不保存退出命令
[2] 查找操作
1> / <需要查找的字符> 向下查找
2> ?<需要查找的字符> 向上查找
注意:如果文本中含有多个匹配字符,则可以按n来自动查找下一个匹配的字符,按N键就可以查找上一个匹配的字符。这样就能对查找到的内容进行上下移动。
2、gcc编译流程
1> 预处理阶段
去掉注释,加载头文件,代替宏定义。
生成产物:预处理文件(以.i结尾)
实例:gcc -E hello.c -o hello.i
2> 编译
编译阶段的主要工作是把我们的源代码生成相应的汇编代码的过程。如果有语法错误,报错,并结束编译过程。
生成产物:汇编文件(以.s结尾)。
实例:gcc -S hello.i -o hello.s
3> 汇编
首先我们应该知道汇编代码(汇编指令)并不是机器能够执行的语言,我们还必须把汇编语言翻译计算机能识别的机器语言。所以在这个阶段把汇编源文件通过汇编器生成目标文件(二进制机器语言)。
实例:gcc -c hello.s -o hello.o
4> 链接
把目标文件执行所依赖的所有二进制的其他目标文件及C的库文件都整合成一个可执行文件的过程
生成产物:可执行程序。
实例:gcc hello.o -o hello
3、进制转换与(原码、反码、补码)
逢2进1
二进制:逢2进1
例如,数字 0、 1、 10、 111、 100、 1000001 都是有效的二进制。
八进制:逢8进1
例如,数字 0、 1、 5、 7、 14、733、 67001、 25430 都是有效的八进制。
十六进制:逢 16 进 1
十六进制中,用 A来表示10,B表示11,C表示12,D表示13,E表示14,F表示15。
例如,数字 0、1、6、9、A、D、F、419、EA32、80A3、BC00 都是有效的十六进制。
将二进制转换成十进制
将八进制转换成十进制
将十六进制转换成十进制
二进制整数和八进制整数之间的转换
二进制整数和十六进制整数之间的转换
[1] 原码
正数用0表示,负数用1表示。数的范围为-127~+127。
[2] 反码
正数用0表示,负数用1表示。
正数:反码与原码相同。
负数:反码可在原码的基础之上,符号位不变,其余位取反。
[3] 补码
正数用0表示,负数用1表示,正数的补码与原码相同,而负数的补码可在原码的基础之上,符号位不变,其余位取反,末位加1。
二、C语言基础
1、C语言标识符与数据类型
1.1 标识符与关键字
标识符
标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。
关键字
[1] 基本数据类型关键字
void:声明函数无返回值或无参数,声明无类型指针,显示丢弃运算结果。(C89标准新增) char:字符型类型数据,属于整型数据的一种。(K&R时期引入) int:整型数据,表示范围通常为编译器指定的内存字节长。(K&R时期引入) float:单精度浮点型数据,属于浮点数据的一种。(K&R时期引入) double:双精度浮点型数据,属于浮点数据的一种。(K&R时期引入) //_Bool:布尔型(C99标准新增) //_Complex:复数的基本类型(C99标准新增) //_Imaginary:虚数,与复数基本类型相似,没有实部的纯虚数(C99标准新增) //_Generic:提供重载的接口入口(C11标准新增)
[2] 类型修饰关键字
short:修饰int,短整型数据,可省略被修饰的int。(K&R时期引入) long:修饰int,长整型数据,可省略被修饰的int。(K&R时期引入) // long long:修饰int,超长整型数据,可省略被修饰的int。(C99标准新增) signed:修饰整型数据,有符号数据类型。(C89标准新增) unsigned:修饰整型数据,无符号数据类型。(K&R时期引入) // restrict:用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式。(C99标准新 增
[3] 复杂类型关键字
struct:结构体声明。(K&R时期引入) union:联合体声明。(K&R时期引入) enum:枚举声明。(C89标准新增) typedef:声明类型别名。(K&R时期引入) sizeof:得到特定类型或特定类型变量的大小。(K&R时期引入) // inline:内联函数用于取代宏定义,会在任何调用它的地方展开。(C99标准新增)
[4] 存储级别关键字
auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配。与static相反。当变量未指定时默认 为auto。(K&R时期引入) static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部。(K&R时期引入) register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器 通过寄存器而不是堆栈传递参数。(K&R时期引入) extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数 时在其他模块中寻找其定义。(K&R时期引入) const:指定变量不可被当前线程改变(但有可能被系统或其他线程改变)。(C89标准新增) volatile:指定变量的值有可能会被系统或其他线程改变,强制编译器每次从内存中取得该变量的值,阻止 编译器把该变量优化成寄存器变量。(C89标准新增)
[5] 流程控制关键字
1*)跳转结构
return:用在函数体中,返回特定值(如果是void类型,则不返回函数值)。(K&R时期引入) continue:结束当前循环,开始下一轮循环。(K&R时期引入) break:跳出当前循环或switch结构。(K&R时期引入) goto:无条件跳转语句。(K&R时期引入)
2*)分支结构
if:条件语句,后面不需要放分号。(K&R时期引入) else:条件语句否定分支(必须与if连用)。(K&R时期引入) switch:开关语句(多重分支语句)。(K&R时期引入) case:开关语句中的分支标记,与switch连用。(K&R时期引入) default:开关语句中的“其他”分支,可选。(K&R时期引入)
1.2 变量和常量
1.2.1 变量
所谓变量是指在程序运行过程中其值可以改变的量。使用变量时必须“先定义,后使用”。
练习:交换杯子里的液体
1.2.2 常量
[1]常量的定义
在程序执行过程中,其值不被改变的量。
常量主要分为两类:
1**)直接常量:直接引用的数字等;
字符常量‘A’ , ‘a’
整型常量10 100 0b1101 0664 0xaf
实型常量3.14 5.69
字符串常量 "hello world""100"
2**)符号常量:使用标识符来代替一个数字(常见的:宏定义常量 和 常变量)
[2]宏定义
#define 也是C语言预处理命令的一种,被称为宏定义指令
1*)类对象宏(object-like macro不带参宏) #define 宏名 宏值 例如:
#define MAX 10
#define PI 3.1415926
2*)类函数宏(带参数宏) #define 宏名(参数列表) 宏值 例如:
#define S(r) PI*r*r
使用宏定义的优点:
-
给数值赋予一定含义,增强代码可读性
-
减少代码编写量
-
可以"一改全改"
练习:租船问题。 写程序计算游客需要付的租船的费用。租船每小时30元,押金100元。游客输入租船时间,计算出 租船费用。租船费用=时间*每小时钱数+押金。要求押金与每小时钱数使用宏定义。
[3]常变量
变量值不可改变的量,使用const修饰
const int a = 10; // 定义一个常变量
a = 9; // 报错,a为const修饰不可改变。
注意:
const修饰后的变量会变成只读,因此无法再次赋值。
常变量与宏定义常量的区别:
宏定义常量是在预处理阶段,使用宏名来代替宏值。而常变量是在程序运行时,程序在内存分配的 一个变量,只不过变量不允许再次赋值。
1.3 C语言数据类型
1.3.1 整型
[1]C语言中的整数类型
整型类型包括短整型(short int)、基本整型(int)、长整型(long int),它们又被分为有符号(signed)和 无符号(unsigned)两种。
[2]sizeof运算符
获取某个数据类型或变量的长度可以使用 sizeof 操作符,以字节为单位来计数。
[3] 整数的显示/打印方法
1*)显示十进制整数
%hd、 %d、 %ld 以十进制、有符号的形式输出 short、 int、 long 类型的整数 %hu、 %u、 %lu 以十进制、无符号的形式输出 short、 int、 long 类型的整数
2*)显示八进制整数
%ho、 %o、 %lo 以八进制、不带前缀、无符号的形式输出 short、 int、 long 类型的整数 %#ho、 %#o、 %#lo 以八进制、带前缀、无符号的形式输出 short、 int、 long 类型的整
3*)显示十六进制整数
%hx、 %x、 %lx 以十六进制、不带前缀、无符号的形式输出 short、 int、 long 类型的整数 %#hx、 %#x、 %#lx 以十六进制、带前缀、无符号的形式输出 short、 int、 long 类型的整
ps:如果 x 小写,那么输出的十六进制数字和前缀都小写;如果 X 大写,那么输出的十六进制数字和前缀都大写。
1.3.2 实型(浮点型)
[1]浮点数的表示形式
1*)小数形式 由数码0~ 9和小数点组成。例如 0.0、 75.0、 4.023、 0.27、 -937.198 等都是合法的小数
2)指数形式 例如 7.25×(10^2)、 0.0368×(10^5)、 100.22×(10^-2)、 -27.36×(10^-3) 等。
C 语言中小数的指数形式为:
2.1E5 = 2.1×(10^5),其中 2.1 是尾数, 5 是指数。 3.7E-2 = 3.7×(10^-2)其中 3.7 是尾数, -2 是指数。 0.5E7 = 0.5×(10^7),其中 0.5 是尾数, 7 是指数。
[2] 浮点数的输出格式
%f:输出十进制计数法的float和double数字; %e:输出指数计数法的float和double数字; %lf、%le:输出double类型的数字; %Lf、%Le:输出long double类型的数字;
1.3.3 字符型(char)
[1]ASCII码表
[2]字符常量
字符常量是用单引号括起来的一个字符;注意只能是英文的单引号,如’a’、’D’、’+’、’?’等都是字符 常量。
注意:字符常量只能是单字符,不能是字符串,不能用双引号。
[3] 字符变量
字符变量使用类型字符char定义的变量。char是英文character(字符)的缩写。字符变量一般占用一个字节(8bit)。它常用来存储字符,当它用于存储字符常量时,实际上是将该字符的ASCII码值存储到内存单元。
例如:char c = ‘?’定义一个字符变量c并使初值为字符’?’。’?’的ASCII代码是63,系统把整数63赋给变量c
练习