C语言督学营(高级阶段)

文章目录

  • 高级阶段
    • 19.C语言语法进阶
      • 1.条件运算符、逗号运算符
        • (1)条件运算符 / 三目运算符   ? :
        • (2)逗号运算符   ,
      • 2.自增自减运算符
      • 3.位运算符:按位或、按位异或、按位取反
        • (1)逻辑与、按位与、左移、右移
        • (2)有符号数右移 vs 无符号数右移
        • (3)按位与、按位或、按位异或、按位取反
        • (4)异或⊕ ^
      • 4.switch-case、do-while
        • (1)switch-case
        • (2)do-while
      • 5.二维数组、二级指针
        • (1)二维数组
        • (2)二级指针
      • 6.OJ19
        • OJ1:移位
        • OJ2:异或,找出只出现了一次的那个数
    • 20.数据的机器级表示
      • 1.补码、在内存中的存储形式
        • (1)求负数 -X 的补码
        • (2)小端存储
      • 2.整型的不同类型、溢出
        • (1)整型的不同类型
          • 表示范围
        • (2)溢出
      • 3.浮点数 IEEE754标准
      • 4.浮点数精度丢失
      • 5.OJ20
    • 21.汇编语言
      • 1.汇编指令格式、C语言与汇编语言的转换
        • (1)变量的修改 过程:
        • (2)CPU的结构、内存的分布
        • (3)指令格式:操作码字段 + 地址码字段
        • (4)复杂指令集CISC、精简指令集RISC
        • (5)C代码生成汇编
          • ①只需要汇编,不要机器码
            • ②地址 + 机器码 + 汇编指令 (408计组汇编大题风格)
      • 2.汇编常用指令 讲解
        • (1)相关寄存器、栈顶指针ESP
        • (2)常用汇编指令 (Intel格式)
          • ①数据传送指令:mov
          • ②算术运算和逻辑运算指令
          • ③控制流指令
        • (3)标志位
      • 3.各种变量赋值 的汇编实战
      • 4.选择循环 的汇编实战
      • 5.函数调用 的汇编实战:C语言指针的间接访问、函数调用、返回值
        • (1)栈空间:函数的栈空间是向下生长的,即由高地址向低地址生长。
        • (2)变量地址赋值 的经典汇编
        • (3)间接访问 的经典解析:两个mov
        • (4)函数调用 的经典解析:call指令 / ret指令
          • ①call指令
          • ②ret指令
      • 6.OJ
      • 7.408真题 大题实战
        • (1)11年43
        • (2)17年44
        • (3)19年45
    • 22.C语言文件操作
      • 1.文件操作原理
        • (1)文件指针:FILE * fp
      • 2.文件打开、文件关闭 实战
        • (1)打开文件:fopen
        • (2)关闭文件:fclose
        • (3)从文件里读一个字符:fgetc
        • (4)往文件里写一个字符:fputc
      • 3.文件读写 实战
        • (1)fwrite、fread
        • (2)fgets、fputs
      • 4.文件位置指针偏移 实战
        • (1)移动读写指针:fseek
        • (2)告知读写指针移动到哪里了:ftell

高级阶段

19.C语言语法进阶

1.条件运算符、逗号运算符

(1)条件运算符 / 三目运算符   ? :

1.条件表达式:表达式1?表达式2:表达式3
①若表达式1为真,则该整体值为表达式2的值
②若表达式1为假,则该整体值为表达式3的值


2.举例:返回 a和b中较大的一个值:
(1)传统方法:if else实现

if(a>b) return a;
else    return b;

(2)条件运算符(三目运算符):

return (a>b)?a:b;

3.条件运算符 ? : 是C语言中唯一的三目运算符



(2)逗号运算符   ,

逗号表达式整体的值 是最后一个逗号后面表达式的值

常见于for循环的表达式1和表达式3
for(i=0,j=0; ;i++,j++)



2.自增自减运算符

1.自增自减运算符   (自增运算符:increment operator)
i++:先运算,再++
++i:先自增,再运算

2.自增自减运算符与取值运算符*的结合

#include <cstdio>int main() {int a[3] = {1,5,10};int *p; //指针pint j;p = a; //p指向数组起始元素j = *p++; //等价于 j=*p;p++;  p自增,是加一个单位,指向下一个元素int型的p自增,地址大4Bprintf("a[0]=%d,j=%d,*p=%d\n",a[0],j,*p); //a[0]=1,j=1,*p=5j = p[0]++;printf("a[0]=%d,j=%d,p[0]=%d",a[0],j,p[0]); //a[0]=1,j=p[0]=5,p[0]=6return 0;
}

3.位运算符:按位或、按位异或、按位取反

(1)逻辑与、按位与、左移、右移

1.位运算符
逻辑与:&&
按位与:& (双目运算符)

<<:左移
>>:右移
移位操作比乘除法效率高。


(2)有符号数右移 vs 无符号数右移

负数的右移,高位补1 (操作的是补码)。无符号数右移高位补0。同样右移一位,但值会不同。


(3)按位与、按位或、按位异或、按位取反

①按位与:&
②按位或:|
③按位异或:^
④按位取反:~

在这里插入图片描述


(4)异或⊕ ^

1.异或的特性
①自己和自己异或为0 【归零率】
②和零异或为自身【恒等率】
③异或满足交换律,从而有 a^b^a = (a^a)^b = 0^b = b【交换律,找单数问题,找只出现一次的数】

2.异或符合的规律
①归零律:a⊕a = 0
②恒等律:a⊕0 = a
③交换律:a⊕b⊕c = a⊕c⊕b
④结合律:a⊕b⊕c = a⊕(b⊕c)


在这里插入图片描述
在这里插入图片描述


4.switch-case、do-while

(1)switch-case

1.代替if-else过多的情况,用switch-case可以简化代码
在这里插入图片描述

2.break;
case只会进行一次的匹配
在这里插入图片描述


3.case后匹配的东西,只能放常量表达式



例题1:一个月有多少天?
在这里插入图片描述
在这里插入图片描述


利用不加break会继续匹配的特性,优化代码:
在这里插入图片描述
在这里插入图片描述



(2)do-while

一定会先执行一次循环体,再进行while判断
在这里插入图片描述



5.二维数组、二级指针

(1)二维数组

二维数组可视为元素是一维数组的一维数组,存储顺序是横着存满一个数组,再存下一个。因此初始化二维数组的时候也可以像一维数组一样横着写开。

1.二维数组中的元素在内存中的存储规则是按行存储,即先顺序存储第一行的元素,后顺序存储第二行的元素,直到最后一行。
2.定义int a[3][4];那么我们可以访问数组的最后一个元素是a[2][3]

在这里插入图片描述


(2)二级指针

二级指针是指针的指针。二级指针的作用是服务于一级指针变量,对一级指针变量实现间接访问。
如果已经掌握了C++引用,则不需要用到二级指针。

如果需要把一个一级指针变量的地址存起来,就要用到二级指针。
二级指针是存储一级指针变量的地址值,也是用于做间接访问

在这里插入图片描述
在这里插入图片描述

应用于C语言中 (没有C++引用的情况下),修改子函数中变量的值,能同步改回main函数
在这里插入图片描述



6.OJ19

OJ1:移位

在这里插入图片描述

#include <stdio.h>int main(){int a;scanf("%d",&a);printf("%2d\n",a<<1);printf("%2d\n",a>>1);return 0;
}

OJ2:异或,找出只出现了一次的那个数

在这里插入图片描述

#include <stdio.h>int main(){int A[5];for(int i = 0; i < 5; i++){scanf("%d",&A[i]);}printf("%d",A[0]^A[1]^A[2]^A[3]^A[4]);return 0;
}



20.数据的机器级表示

在这里插入图片描述


1.补码、在内存中的存储形式

在这里插入图片描述


(1)求负数 -X 的补码

[ X ] 原 = [ X ] 补 ⇔ [ − X ] 补 [X]_原=[X]_补\Leftrightarrow[-X]_补 [X]=[X][X]:(X>0)
①符号位和数值位全部按位取反,再末位+1 (用于计算短的8-16位补码)
②找到最右边的1, 其左边符号位和数值位都取反 (用于计算长的32位补码)

例:5的原码是 0000 0000 0000 0000 0000 0101,5的补码=5的原码,-5的补码是 1111 1111 1111 1111 1111 1111 1111 1011。可用①、②两种方式分别尝试

负数越小,则其补码的值越大,1越多


(2)小端存储

1.X86数据在内存中按照小端存储方式存储

2.从右到左,是从高字节到低字节。(低字节,即数学上的低位数)

3.从左到右,是低地址到高地址。

4.小端存储就是,低地址存低字节,高地址存高字节。
大端存储:低地址存高字节,高地址存低字节,符合人类阅读习惯

在这里插入图片描述


2.整型的不同类型、溢出

(1)整型的不同类型

有符号、无符号 unsigned + 短整型 short、基本整型 int、长整型 long

有符号数:0111 1111 1111 1111 B = 215-1 = 32767
无符号数:1111 1111 1111 1111 B = 216-1 = 65535

在这里插入图片描述


表示范围

n位带符号整数补码的表示范围: − 2 n − 1 ∼ 2 n − 1 − 1 -2^{n-1}\sim 2^{n-1}-1 2n12n11 (n位带符号整数,1位符号位,n-1位数值位。n-1个1后再加1会舍去进位,全变0)

-127:原码 1111 1111,补码 1000 0001
-128:原码 1000 0000 (进位被舍去),补码 1000 0000

short:-32768~32767
unsigned short:0~65535
int:2-31~231-1,±21亿
float:2-126~2127


(2)溢出

1.溢出:数据超出了该数据类型的表示范围

2.解决溢出:用拥有更表示大空间的整数来存储

3.若程序数值大于double类型的 264-1:自行实现大整数加法


3.浮点数 IEEE754标准

浮点数的IEEE754 标准,用 ±1.M×2E-127 表示一个二进制数。类似十进制的科学计数法。

例如 十进制998可以由科学计数法表示为9.98×102。 二进制 1110 可以由IEEE754标准 表示为 1.110×23

在这里插入图片描述

第1位:符号位S,0为正数 1为负数
第2~9位:阶码E (8位无符号数),表示范围 1~254 (全为0和全为1是特殊情况),再减去127 为幂次
第10及以后:小数部分 尾数M

在这里插入图片描述

#include <stdio.h>int main(){float f1 = 4.5;float f2 = 1.456;return 0;
}

在这里插入图片描述

打断点,看内存视图


4.浮点数精度丢失

在这里插入图片描述

int溢出、float精度丢失:改成double类型


5.OJ20

在这里插入图片描述


解:赋值float j = 1.456,查看j在内存中的存储
在这里插入图片描述

j在内存中 以小端方式 保存为 35 5E BA 3F,大端方式为 3F BA 5E 35H,即 0011 1111 1011 1010 0101 1110 0011 0101B:
幂次为 0111 1111B,即127-127=0。
小数部分为:011 1010 0101 1110 0011 0101B,共有13个1
故输出,0,13。代码如下:

#include <stdio.h>int main() {float i = 4.5;float j = 1.456;printf("%3d%3d\n",0,13);return 0;
}




21.汇编语言

在这里插入图片描述

更多更详细内容见:计算机组成原理第四章:指令系统 - 程序的机器级代码表示


1.汇编指令格式、C语言与汇编语言的转换

(1)变量的修改 过程:

加法器不能直接修改内存的栈中变量的值,需要先将内存数据读取到寄存器,然后修改寄存器中变量的值,再写回内存。
在这里插入图片描述


(2)CPU的结构、内存的分布

CPU包括:
(1)运算器:加法器、ALU
(2)控制器:控制单元CU、IR、PC
在这里插入图片描述


(3)指令格式:操作码字段 + 地址码字段

零地址指令、一地址指令、二地址指令、三地址指令

在这里插入图片描述

寄存器:register
存储器:storage


(4)复杂指令集CISC、精简指令集RISC

在这里插入图片描述


(5)C代码生成汇编
①只需要汇编,不要机器码

在这里插入图片描述


新建C项目,点击终端,输入gcc -S -fverbose-asm main.c,左侧会生成mian.s

在这里插入图片描述


②地址 + 机器码 + 汇编指令 (408计组汇编大题风格)

在这里插入图片描述



2.汇编常用指令 讲解

(1)相关寄存器、栈顶指针ESP

ESP:栈顶指针
EBP:栈基指针

在这里插入图片描述

栈顶指针ESP:Extended Stack Pointer。其中"E" 表示扩展寄存器(Extended Register)。


(2)常用汇编指令 (Intel格式)

在这里插入图片描述


①数据传送指令:mov

1.mov指令:用于移动数据

mov destination,source
mov BX,AX //将寄存器 AX中的值转移到寄存器 BX

2.push指令:压栈指令

3.pop指令:弹栈指令


②算术运算和逻辑运算指令

1.add/sub指令:加法、减法指令

2.inc/dec:自增自减指令

3.imul指令:带符号数乘法指令

4.idiv指令:带符号数除法指令

5.and/or/xor指令:按位与 / 按位或 / 按位异或 指令

6.not指令:取非指令

7.neg指令:取负指令

8.shl/shr指令:逻辑移位指令

9.lea指令:地址传送指令,“Load Effective Address”,用来计算并加载一个有效地址。


③控制流指令

1.jmp指令:无条件转移指令

2.jxx / jcondition指令:条件转移指令

3.cmp/test指令:比较指令

4.call/ret指令: 函数调用指令/函数返回指令


(3)标志位

标志位 / 状态字 / 条件码 / flagbit:
①结果为零:ZF = 1 (零标志 ZF)
②结果位负:SF = 1 (符号标志 SF)
③带符号整数溢出:OF = 1 (溢出标志 OF)
④无符号整数溢出:CF = 1 (进借位标志 CF)

判断溢出:正 + 正 = 负,负 + 负 = 正,正 - 负 = 负

OF和SF对无符号整数没有意义,CF对带符号整数没有意义,【11年17.】


在这里插入图片描述



3.各种变量赋值 的汇编实战

生成汇编的指令:gcc -m32 -masm=intel -S -fverbose-asm main.c
生成汇编文件 main.s

在这里插入图片描述


变量赋值:variable assignment

#include <stdio.h>//整型、整型数组、整形指针的汇编
int main() {int arr[3] = {1,2,3};int *p;int i = 5;int j = 10;i = arr[2];p = arr;printf("i=%d\n",i);return 0;
}

ESP 栈顶指针的偏移,来获取对应变量内存空间的数据

在这里插入图片描述



4.选择循环 的汇编实战

在这里插入图片描述



5.函数调用 的汇编实战:C语言指针的间接访问、函数调用、返回值

在这里插入图片描述
在这里插入图片描述


(1)栈空间:函数的栈空间是向下生长的,即由高地址向低地址生长。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


(2)变量地址赋值 的经典汇编
p = &a;lea eax,[esp+16]
mov DWORD PTR [esp+28],eax

在这里插入图片描述


(3)间接访问 的经典解析:两个mov
mov eax, DWORD PTR [esp+28]   //间接地址保存到寄存器eax
mov eax, DWORD PTR [eax]  	  //取间接地址的内容

在这里插入图片描述


(4)函数调用 的经典解析:call指令 / ret指令
①call指令

call后,被调函数的开头必然是:

push ebp
mov ebp,esp    //或 enter指令

ebp和esp的区别:
在这里插入图片描述


②ret指令

被调函数ret前,必然是:

mov esp,ebp
pop ebp      //或 leave指令

在这里插入图片描述

在这里插入图片描述


6.OJ

在这里插入图片描述

#include <stdio.h>int main() {printf("mov\npush\npop\n");return 0;
}

7.408真题 大题实战

(1)11年43

在这里插入图片描述

分析:
(1)R1:unsigned int x = 134 = 128+6 = 1000 0110B = 86H
R2:unsigned int y = 246 = 255 -9 = 1111 0110B = F6H
R5:unsigned int z1 = x-y,R6:unsigned int z2 = x+y,
①法一:补码二进制加减法 (求十六进制,推荐此法)
z1 = x-y = x+(-y) = 1000 0110B + 0000 1010B = 1001 0000B = 90H
z2 = x+y = 1000 0110B + 1111 0110B = (1)0111 1100B = 7CH
②法二:真值取模加减法
z1 = (x-y)%2n = (134-246)%28 = -112%256 = 144 = 128 + 16 = 1001 0000B = 90H
z2 = (x+y)%2n = (134+246)%28 = 380%256 = 124 = 127-3 = 0111 1100B = 7CH


(2)考察数据类型转换:unsigned int → int,机器数(补码)不变,解释方式改变
①法一:补码二进制加减法
m的机器数与x的机器数相同,均为1000 0110B,m = 1111 1010B = -(127-4-1) = -122
int k1 = m - n的机器数与 x-y机器数相同,均为90H = 1001 0000B,则 k1 = 1111 0000B = -(64+32+16) = -112

②法二:真值取模加减法 (求十进制,推荐此法)
int m = x = 1000 0110B,m = 1111 1010B = -(127-4-1) = -122
int n = y = 1111 0110B,n = 1000 1010B = - (8+2) = -10
int k1 = m-n = -122-(-10) = -112


答案:
(1)R1:86H、R2:90H、R3:7CH
(2)m:-122、k1:-112
(3)能。
理由:无论是带符号整数的加法运算还是无符号整数的加法运算,都可以用加法器实现。加法器只负责对二进制数进行计算并产生标志,运算前并不区分有无符号。
补码减法操作可以用补码加法操作实现,即 a-b = a+(-b)
(4)①OF = Cn⊕ Cn-1 = 1,即最高位的进位与次高位的进位不同,则带符号整数溢出。
②int k2 = m+n; 发生下溢
在这里插入图片描述
在这里插入图片描述


二进制:binary
八进制:octonary
十进制:decimal
十六进制:hexadecimal


(2)17年44

在这里插入图片描述
在这里插入图片描述

答案:
(1)CISC。复杂指令集的指令长度不定长。
(2)60H = 96 字节
计算过程:0040107FH - 00401020H +1 = 5FH + 1 =60H = 96
(3)CF = 1
计算过程:unsigned int n = 0 = 0000 0000H,则 n-1 = FFFF FFFFH。i = 0 = 0000 0000H。
则 i-(n-1) = i+[-(n-1)] = 0000 0000H + 0000 0001H = 0000 0001H。则最高位进位 Cn=0。由于是减法,则sub = 1。∴CF = Cn⊕sub = 0⊕1 = 1
(4)不能。∵f2是float类型,遵循 IEEE754规则,float数值×2应当是阶码+1,而不是简单地整体左移一位。

在这里插入图片描述


(3)19年45

在这里插入图片描述
在这里插入图片描述

答案:
(1)①10次
②执行第16行 call指令
(2)①第12行 jle 是条件转移指令
②第16行 call 函数调用指令、第20行 jmp 无条件转移指令、第30行 ret 子程序的返回指令
(3)①0040102AH
②目标地址 = (PC) + “1” + OFFSET,即 00401000H = 0040102AH + OFFSET,即OFFSET = 00401000H - 0040102AH = FF FF FF D6H。
③根据第16行的call指令后4字节,知偏移量字段为D6 FF FF FF,可以确定M采用小端方式。
(4)①f(13)=13!=6,227,020,800,超过了int值能表示的最大范围,发生了溢出,故值不相等。
②要使得f1(13)的返回值得到正确结果,应将int类型改为 double 或 long long 类型
(5)①若乘积的高33位既不是全0 也不是全1,则OF=1
②编译器应在imul指令后加一条 “溢出自陷指令”,即trap指令。使得CPU自动查询溢出标志OF,当OF=1时调出“溢出异常处理程序”。

在这里插入图片描述

Intel X86:小端方式、CISC、转移指令采用 相对寻址方式



22.C语言文件操作

1.文件操作原理

在这里插入图片描述
在这里插入图片描述


(1)文件指针:FILE * fp

FILE * fp 是FILE类型的指针
FILE是一个结构体,已经定义在 <stdio.h>中

在这里插入图片描述


2.文件打开、文件关闭 实战

#include <stdio.h>//练习文件打开
int main() {//1.打开文件FILE *fp; //定义一个FILE类型的指针fp = fopen("file.txt","r+"); //打开文件if(NULL==fp){perror("fopen");  //perror用于定位失败原因return -1;}//2.读取文件char c;
//    c = fgetc(fp);
//    printf("%c\n",c);while((c=fgetc(fp))!=EOF){printf("%c",c);}printf("\n");//3.写文件c = fputc('H',fp);if(-1==c){perror("fputc");return -1;}//4.关闭文件fclose(fp); //关闭文件return 0;
}

(1)打开文件:fopen
FILE *fp; 	//定义一个FILE类型的指针
fp = fopen("file.txt","r"); 	//打开文件

在这里插入图片描述


1.r+ 与 rb+
“r+“是 文本模式 写入文件,”\n"会保存为”\r\n",多一个字节 (Windows)
"rb+"是 二进制模式 写入文件
在这里插入图片描述

2.rb+ 与 wb+
wb+:若没有该名字的文件,则可创建该名字的文件。若已有该名文件,则删除原文件,再新建一个该名字文件。


在这里插入图片描述


(2)关闭文件:fclose
fclose(fp); //关闭文件

在这里插入图片描述


(3)从文件里读一个字符:fgetc
c = fgetc(fp);

fgetc读到文件结尾返回EOF

在这里插入图片描述


(4)往文件里写一个字符:fputc
c = fputc('H',fp);

fputc读到文件结尾返回EOF

在这里插入图片描述


3.文件读写 实战

(1)fwrite、fread

1.fwrite:将buf中的字符串等数据写入文件

fwrite(字符数组名,单个字符长度,数组长度,文件指针名)

fwrite(buf,sizeof(char),strlen(buf),fp); //把buf中的字符串写入文件
#include <stdio.h>
#include <string.h>int main() {char buf[20] = "hello\nworld";FILE *fp = fopen("file.txt","r+"); //r+:以文本方式打开文件if(NULL == fp){perror("fopen");return -1;}   //ret的值:fwrite读了多少个字符int ret = fwrite(buf,sizeof(char),strlen(buf),fp); //把buf中的字符串写入文件fclose(fp);return 0;
}

fwrite写整型数
在这里插入图片描述


2.fread

fread(str,sizeof(char),sizeof(str),fp);

在这里插入图片描述
在这里插入图片描述


(2)fgets、fputs

fgets:读文件、读标准输入,一次读一行。读到文件结尾返回 NULL
在这里插入图片描述

while((fgets(buf,sizeof(buf),fp)) != NULL){  //一次读一行,把文件读空printf("%s",buf);						//读文件用fp,读标准输入用stdin
}

fputs:

在这里插入图片描述

fgtc、fputc、fgets、fputs只能以文本方式。文本模式只能读写字符串,二进制模式 字符串、整型数、浮点数、结构体都可以写。
在这里插入图片描述


4.文件位置指针偏移 实战

(1)移动读写指针:fseek

fseek(文件类型指针,位移量,起点)

fseek(fp,-5,SEEK_CUR);

fseek调用成功返回0,调用失败返回非零。

在这里插入图片描述


#include <stdio.h>
#include <string.h>int main() {FILE *fp;char str[20] = "hello\nworld";int len = 0,ret;long pos;fp = fopen("file.txt","wb+");if(NULL == fp){perror("fopen");return -1;}len = strlen(str);fwrite(str,sizeof(char),len,fp);fseek(fp,-11,SEEK_CUR);while((fgets(str,sizeof(str),fp)) != NULL){  //一次读一行,把文件读空printf("%s",str);						//读文件用fp,读标准输入用stdin}return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


(2)告知读写指针移动到哪里了:ftell

在这里插入图片描述

long pos;
pos = ftell(fp);
printf("now pos = %ld\n",pos);

完整版代码:文件写、文件指针偏移、文件指针位置查看、文件读

#include <stdio.h>
#include <string.h>int main() {FILE *fp;char str[20] = "hello\nworld";int len = 0,ret;long pos;fp = fopen("file.txt","wb+");if(NULL == fp){perror("fopen");return -1;}len = strlen(str);fwrite(str,sizeof(char),len,fp);ret = fseek(fp,-len,SEEK_CUR);  //文件指针返回开头位置if(ret != 0){perror("fseek");fclose(fp);return -1;}pos = ftell(fp);printf("now pos = %ld\n",pos);memset(str,0,sizeof(str));   //清空strfread(str,sizeof(char),sizeof(str),fp);printf("str=\n%s\n",str);//    while((fgets(str,sizeof(str),fp)) != NULL){  //一次读一行,把文件读空
//        printf("%s",str);						//读文件用fp,读标准输入用stdin
//    }return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/622758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker学习与应用(五)-DockerFile

1、DockerFile 1&#xff09;DockerFile介绍 dockerfile是用来构建docker镜像的文件&#xff01;命令参数脚本&#xff01; 构建步骤&#xff1a; 1. 编写一个dockerfile文件 2. docker build 构建称为一个镜像 3. docker run运行镜像 4. docker push发布镜像&#xff08;D…

LC 83. 删除排序链表中的重复元素

83. 删除排序链表中的重复元素 难度 &#xff1a; 简单 题目&#xff1a; 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 提示&#xff1a; 链表中节点数目在范围 [0, 300] 内-100 < Node.va…

蓝桥杯准备

书籍获取&#xff1a;Z-Library – 世界上最大的电子图书馆。自由访问知识和文化。 (zlibrary-east.se) 书评&#xff1a;(豆瓣) (douban.com) 一、观千曲而后晓声 别人常说蓝桥杯拿奖很简单&#xff0c;但是拿奖是一回事&#xff0c;拿什么奖又是一回事。况且&#xff0c;如果…

Docker教程

docker 安装 官方文档 wget -qO- https://get.docker.com/ | sh sudo usermod -aG docker your-user sudo usermod -aG docker ${USER} newgrp docker # 更新docker用户组 cat /etc/group | grep docker docker --version 使用非root用户管理 帮助启动类 命令 system…

寄快递有没有什么省钱的小妙招? 怎样寄快递才能省钱呢?

快递物流行业的快速崛起刺激了人们的消费欲望&#xff0c;其中典型的是每每到重大节日尤其是双十一或者双十二&#xff0c;消费市场异常火爆&#xff0c;这也使得快递行业加班加点的干也不追不上人们下单的速度。如今&#xff0c;互联网时代崛起&#xff0c;网购成为了大家最寻…

机器学习_捕捉函数的变化趋势(凸函数)

文章目录 连续性是求导的前提条件通过求导发现 y 如何随 x 而变凸函数有一个全局最低点 机器学习所关心的问题之一捕捉函数的变化趋势&#xff0c;也就是标签&#xff08;y&#xff09;是如何随着特征字段&#xff08;x&#xff09;而变化的&#xff0c;这个变化趋势是通过求导…

代码随想录day30 回溯算法最终章

51. N皇后 题目 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案&#xff0c;该方案中 Q 和…

想做好项目,网工必看!

上午好&#xff0c;我是老杨。 做项目&#xff0c;贯穿一个网络工程师职业生涯的始终。不管是大项目还是小项目&#xff0c;做久了项目&#xff0c;都会形成一种自己的方法论。 项目要划分&#xff0c;无非就是新网组建&#xff0c;旧网优化&#xff0c;以及网络排障三大类。…

ISO11898-闭环高速CAN网络 (125K~1Mbps)

ISO11898 标准的物理框图如下图 可理解为一个高速闭环 CAN 总线网络&#xff1b;CAN 闭环总线网络允许总线最大长度为 40m;最高速度为 1Mbps;可以看到总线的两端各有一个 120Ω 的电阻&#xff0c;此电阻作为阻抗匹配功能&#xff0c;以减少回波反射;节点就是不同的设备&#…

Pytorch基础知识点复习

文章目录 并行计算单卡训练多卡训练单机多卡DP多机多卡DDPDP 与 DDP 的优缺点 PyTorch的主要组成模块Pytorch的主要组成模块包括那些呢&#xff1f;Dataset和DataLoader的作用是什么&#xff0c;我们如何构建自己的Dataset和DataLoader&#xff1f;神经网络的一般构造方法&…

k8s的策略

集群调度&#xff1a; Scheduler的调度算法&#xff1a; 预算策略 过滤出合适的节点 优先策略 选择部署的节点 NodeName&#xff1a;硬策略&#xff0c;不走调度策略&#xff0c;node1 nodeSelector&#xff1a;根据节点的标签选择&#xff0c;会走一个调度算法 只要是…

系统性学习vue-vue核心

做了三年前端,但很多系统性的知识没有学习 还是从头系统学习一遍吧 课程是b站的Vue2.0Vue3.0课程 后续还会学习的如下,就重新开一篇了,不然太长,之后放链接 vue组件化编程 vue-cli 脚手架 vue中的ajax vue-router vuex element-ui vue3 老师推荐的vscode针对vue的插件: Vue 3…

机器学习~从入门到精通(二)线性回归算法和多元线性回归

为什么要做数据归一化 一、数据归一化&#xff1a; 1.最值归一化 2.均值方差归一化import numpy as npX np.random.randint(1,100,size100) X X.reshape(-1,2) X.shape X np.array(X,dtypefloat) X[:,0] (X[:,0]-np.min(X[:,0]))/(np.max(X[:,0])-np.min(X[:,0])) X[:,1]…

Postgres 中文周报:Postgres Weekly 537 期

本周报由 Cloudberry Database 社区编译自英文版《Postgres Weekly》&#xff0c;译文较原文有所调整。 推荐博文 &#x1f3c6; PostgreSQL: The DBMS of the Year 2023 PostgreSQL 荣获 DB-Engines 网站 2023 年度 DBMS 冠军。DB-Engines 收集了 480 款数据库系统信息并跟踪…

机器学习笔记 - 基于OpenCV+稀疏光流的无监督运动检测

一、简述 在各种高级开源库的帮助下&#xff0c;检测固定摄像机拍摄的运动行为是轻而易举可以实现的&#xff0c;但检测移动的摄像机拍摄的移动物体的运动检测依然是一个复杂的问题。在这里&#xff0c;我们将继续基于稀疏光流&#xff0c;并检测移动的无人机相机的运动。 这里…

设计模式-传输对象模式

设计模式专栏 模式介绍模式特点应用场景传输对象模式和序列化的区别代码示例Java实现传输对象模式Python实现传输对象模式 传输对象模式在spring中的应用 模式介绍 传输对象模式&#xff08;Transfer Object Pattern&#xff09;是一种设计模式&#xff0c;用于从客户端向服务…

MT8766安卓核心板/开发板_MTK联发科4G安卓手机主板方案定制开发

MT8766采用台积电 12 nm FinFET 制程工艺&#xff0c;4*A53架构&#xff0c;Android 9.0操作系统&#xff0c;搭载2.0GHz 的 Arm NEON 引擎。提供了支持最新 OpenOS 及其要求苛刻的应用程序所需的处理能力&#xff0c;专为具有全球蜂窝连接的高移动性和功能强大的平板设备而设计…

MySQL进阶篇(五) 锁

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问…

深入浅出Android dmabuf_dump工具

目录 dmabuf是什么&#xff1f; dmabuf_dump工具介绍(基于Android 14) Android.bp dmabuf_dump.cpp 整体架构结构如下 dmabuf_dump主要包含以下功能 前置背景知识 fdinfo 思考 bufinfo Dump整个手机系统的dmabuf Dump某个进程的dmabuf​​​​​​​ 以Table[buff…

【JVM 基础】类字节码详解

JVM 基础 - 类字节码详解 多语言编译为字节码在JVM运行Java字节码文件Class文件的结构属性从一个例子开始反编译字节码文件字节码文件信息常量池方法表集合类名 再看两个示例分析try-catch-finallykotlin 函数扩展的实现 源代码通过编译器编译为字节码&#xff0c;再通过类加载…