Shell入门
本文章未经过可读性提升 讲义 课堂内容 终端 里有 shell Linux默认bash,现在有Zsh,与bash兼容 自动化 编程语言 组合程序 开源软件都离不开shell prompt 是最前面那串东西 1alice@ubuntu:~$ alice表示用户名 ubuntu表示机器 ~表示主目录 $表示不是root用户 参数解析:字符串,空白字符分割如空格tab,第一个是程序名,后面每一个是参数。可以用双引号来让一个参数含有空白字符 可以用转义符 man 跟另一个程序的名字,会解释怎么用 很多程序后面加–help可以获得简明版的解释 cd change directory 后面加路径 很多程序都是默认在当前工作目录下运行的 正斜杠/开头表示绝对路径 相对路径是不用/开头的路径,解析基于当前工作目录 相对路径里会用到:.当前路径,一种引用当前位置的方法 …父级目录,往上走一层 可以包在/之间,一次一次 …/…:往上走2层 ~代表主目录 ~/…会到达/home ZOxide 更方便的工具跳目录 cd 后打了一部分了,按个tab,会给你展示可能的目标,如果没有歧义,会直接补全 sh...
高程整理10-其他
其他 零散的一些东西,不能被归入哪个大主题 头文件 用于多源文件项目的公共信息传递。正如前面的课程所说,一个源程序需要使用函数,要使用全局变量,都是需要在前面声明的,每一个源程序都这样去声明一样的东西,会很麻烦且维护性差,那么就可以把一样的东西都写到头文件里去 头文件里可以含有: 符号常量 常变量 函数、全局变量的extern、结构体、类 的声明 不能放全局变量的定义 不建议在头文件里面把类似#include <iostream>啊,using namespace std;啊这种都写进去,每次引一下自己的头文件就好了。这样看似快,但是违背了权限最小化原则,把很多东西在不知道的情况下放了出来。 #include <xxx>会优先在系统目录里找,找不到报错;#include "xxx"优先在当前文件夹找,找不到去系统目录找,找不到报错。 头文件里的#pragma once代表让这个头文件只能被#include一次 一些头文件说明 C++ 原生没有字符串变量,用字符数组来模拟。#include<string> 是...
高程整理9-结构体、类、对象
9.结构体、类、对象 结构体 声明、定义 同一结构体内的成员名不能同名,但是可以和结构体以外的名字同名 结构体声明方法 12345struct student{ int age; char name[10]; ……}; 声明的位置决定了能在哪里使用这个结构体,就跟之前的变量一个道理。 声明可以不带具体的成员,但是那样的声明后面只能使用这个结构体的整体,里面的成员是不能操作的,所以比较鸡肋。 不同源文件的结构体本质上是不同的结构体,所以如果需要让同一个结构体在多个源文件同步使用同步修改,要写头文件。 结构体变量定义的时候,C语言不能省去struct修饰:struct student s1;,在C++里面可以省去struct修饰:student s1; 结构体变量可以在声明的同时定义。这样的东西不能放到头文件里去,否则导致出现全局变量。 12345struct student{ int age; char name[10]; ……} s1, s_list[10], *p_s3; 结构体可以不声明名字,一次性使用结...
高程整理8-指针
8.指针 概念 32位、64位,指的是CPU单次处理数据的能力,也就决定了CPU的寻址能力,由此决定了虚拟内存的位数。 32位,理论的内存容量极限是4GB,指针变量大小为4个字节。 64位,理论的内存容量极限是16EB,指针变量大小为8个字节。 (指向某一变量的)指针:某一变量的地址 指针变量:存放地址的变量 定义指针变量: 12int a;int *p = &a; 这里有一个int型变量,现在创建了一个指针p指向a。下面的int是指针的基类型,指针变量p里面存储了a的地址,&a即为取a的地址。 由于基本上所有数据类型都不是只占一个字节的,所以指针想要指一个变量,还应该知道这个变量的长度,这由指针的基类型负责。基类型是int,那么就认为指向的变量长度4个字节,在使用的时候就有充足的信息。 可以定义void *p;。void声明的指针就是不知道对应的长度,所以只能存地址用。 在64位下,指针的大小全是8字节。 指针的使用,必须要有实际具体的值,否则就是野指针,属于严重错误 使用 12p = 0x................;//p对应地址*p = 12...
高程整理7-数组
7.数组 基本 int a[10];里的’[‘和’]'都是运算符。 vla,可变长数组,定义时用变量做长度,曾经支持过,但是会引发UB,现在不要用 直接打数组名,出来的是第一个元素的地址。 数组越界,如果越界的不多,可能刚刚好越到代码里定义的其他变量上,这个时候MSVC编译出来的程序甚至会觉得没问题,因为那个越界对应的地址确确实实是程序申请的内存,会认为你确实能改,导致其他的变量意外地就不对了。 一维数组 一维数组初始化 123456int a[10] = {1,2,3,4,5,6,7,8,9,10};int a[10] = {1,2,3,4,5,6,7,8,9,10,11};//报错int b[] = {1,2,3,4,5,6,7,8,9,10};//数组长度缺省?数组长度自动为10,因为后面有10个数字int c[10] = {1,2,3};//下标3~9的全部自动为0.int d[1000] = {0};//全部都是0了!但是理解方式应该为:将d[0]初始化为0,其他的...
高程整理6-函数
6.函数 基本 定义无参函数 括号里面除了空着,也可以加一个void: 1234int fun1(void){ ...} 函数返回值类型缺省,在C语言里缺省默认为int(不建议缺省),在C++里报错。 ANSI C++要求main函数只能返回int类型。不管在哪里,都建议将int作为唯一的main函数返回类型。 形参:函数定义实现那里出现的参数;实参:调用函数时填到括号里的参数。 调用函数只会把实参复制一份给形参,形参怎么搞都不影响实参。“单向传值”,“只读“。 形参在调用时刻申请内存,函数结束时刻释放内存。 实形参类型不一致,进行以形参为目标的隐式类型转换。可能导致错误。 返回值类型和函数定义的返回类型不一致,进行以函数定义返回类型为目标的隐式类型转换。可能导致错误。 返回类型void的函数,可以写return;,也可以不写,其他返回类型一般必须写。 如果函数定义中有分支、循环导向return语句的,如果没有覆盖全部分支出口(无论从表达式上看是否已经覆盖)都会报警告。 函数的定义在调用后面,则需要在调用前声明...
高程整理5-控制语句
5.控制语句 goto语句,直接无条件跳转到其他位置,位置用语句标号来标识,命名和变量名规则一样。本课程禁止使用。 if if后面跟的大括号里面这个是语句序列,语句序列只有1个语句可以把大括号省略。 if-else一整个当作一个语句来看 多支语句,中间写的是else if()…… 用多支语句来判断区间,第一个支是a>=90,第二个支写成a>=80 && a<90是最好的,即使a是整型,a<=89也没那么好,因为如果你要改成浮点数,那a<90的写法是不用改的。 语句序列只有一个语句可以省略大括号的原则,可以应用于else后面直接跟if的情况。 if语句的大括号可以用栈来配对。 switch switch只能用来匹配整形。case后是整形。这是因为浮点数有误差,没法匹配。 switch语句的执行逻辑:算出括号内表达式的值,然后去下面的case里一一对应。一旦他找到一个case匹配上了,那么在此处进入程序,一句句顺序执行,所以后面的case对他而言就是不存在。如果想要达成一个数一种操作,就要在每一个case的最后加一句break...
高程整理4-表达式、运算符
4.表达式、运算符 C/C++中任意表达式都有值 表达式类型:意思就是最后一步运算是什么类型。b=(a=3*6,a/2):赋值表达式 一个级别的运算符只可能是同一个结合性。 运算符优先级 (经过筛选,留下高程涉及到的) 完整版 运算符 结合性 含义 例子 优先级第 1 组 :: L-R 作用域解析运算符 Time::Time()std::cout 优先级第 2 组(表达式) () L-R 函数调用 fun(1) () 值构造,即 type(expr) Time(12,0,0) [] 数组下标 str[1] -> 间接成员运算符 p->year . 直接成员运算符 day1.year static_cast 专用的类型转换 static_cast<int>(2.3) ++ 加 1 运算符,后缀 a++ -- 减 1 运算符,后缀 a-- 优先级第 3 组(全是一元运算符) ! R-L 逻辑非 !true + 一元加号(正号) +2 - 一元减号(负...
高程整理3-C输入输出
3.C输入输出 printf/scanf格式字符 考试会给不用记 printf所用的格式字符的种类 格式字符 说明 d, i 带符号的十进制形式整数(正数不带+) o 八进制无符号形式输出整数(不带前导0) x, X 十六进制无符号形式输出整数(不带前导0x) u 十进制无符号形式输出整数 c 以字符形式输出(一个字符) s 输出字符串 f 以小数形式输出浮点数 e, E 以指数形式输出浮点数 g, G 从f,e中选择宽度较短的形式输出浮点数 printf所用的附加格式字符的种类 附加格式字符 说明 字母l 表示长整型整数,用于d, o, x, u前 字母h 表示短整型整数,用于d, o, x, u前 正整数m 表示输出数据的宽度 正整数.n 对浮点数,表示n位小数对字符串,表示前n个字符 - 输出左对齐 scanf所用的格式字符的种类 格式字符 说明 d, i 输入带符号的十进制形式整数 o 输入八进制无符号形式整数(不带前导0) x, X 输入十六进制无符号形式整数...
高程整理2-C++输入输出
2.C++输入输出 基本 cin、cout、<<、>> cin、cout都是对象。 <<、>>此处是流插入、提取运算符,原来是位操作运算符,7级优先级,经过重载变成现在的功能。重载运算符现在不学。 cout << a;实际上是表达式语句。可以使用对表达式分析的方式进行解释。 <<在cout对象和a变量之间进行运算。运算的值是cout对象本身。 cout << a,b,c;实际上是一个逗号表达式,表达式的值是c,最终只会输出a的值。 缓冲区 cout被插入数据后,存储在缓冲区内,当满足条件(缓冲区满/endl/‘\n’/使用cout.flush();刷新)才会集中输出一次。Windows系统下对这个规则的遵守不如Linux规范。 cin不会被直接提取数据,输入的数据会存储在缓冲区内,当满足条件(缓冲区满/‘\n’)才会集中被提取一轮数据。 输入输出设备均可以更改,称为输入/输出重定向。 输出会自动判断数据类型,选择合适的方法输出。char类型会自动按照字符输出。如果想要按数字或者按字...