【新书推荐】7.3 for语句
本节必须掌握的知识点:
示例二十四
代码分析
汇编解析
for循环嵌套语句
示例二十五
7.3.1 示例二十四
■for语句语法形式:
for(表达式1;表达式2;表达式3)
{
语句块;
}
●语法解析:
第一步:执行表达式1,表达式1初始化循环变量;
第二步:执行表达式2,表达式2条件判断语句,如果表达式条件为真,则执行循环体内的语句块,否则退出for语句;
第三步:执行循环体内的语句块;
第四步:执行表达式3后置表达式;
第五步:继续执行下一轮循环,直到表达式2的条件为假,跳出for循环语句。
执行顺序:表达式1->表达式2->循环语句块->表达式3->表达式2->循环语句块->表达式3->表达式2->循环语句块……一直循环下去,直到到表达式2为假时,停止循环。接下来我们示例二十四来理解for语句的执行流程。
示例代码二十四
●第一步:分析需求,设计程序结构框架。
分析需求:构建一个for循环语句,当i<= 5时,重复执行for语句内的重复块。
设计程序结构框架:循环结构for语句。
●第二步:数据定义,定义恰当的数据结构;
int i;//定义一个int类型的整型局部变量i,并将其初始化为0,作为循环变量。
●第三步:分析算法。
利用for语句,当i<= 5时,重复执行for语句内的重复块。先判断后执行。
●第四步:编写伪代码,即用我们自己的语言来编写程序。
int main(void) {
定义一个int类型整型循环变量i;
表达式1:将循环变量i初始化为0;
表达式2:当i <= 5时执行大括号内的循环语句块
表达式3:执行完printf语句后,循环变量i加1
for (i = 0; i <= 5; i++){
调用printf函数打印信息:"i = %d\n"
}
调用printf函数打印信息:"i = %d\n"
system("pause");
return 0;
}
●第五步:画流程图,使用Visio、Excel或者其他绘图工具绘制算法流程和逻辑关系图; 如图7-3所示。
图7-3 示例二十四for循环语句
●第六步:编写源程序,其实就是将我们的伪代码翻译成计算机语言;
/*
for语句
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
for (i = 0; i <= 5; i++)
{
printf("i = %d\n", i);
}
printf("i = %d\n", i);
system("pause");
return 0;
}
●输出结果:
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
●第七步:调试程序,修复程序中可能出现的BUG;
参见反汇编代码。
●第八步:优化代码,尝试更好的设计方案,效率更高的算法,逻辑更为清晰简洁明了。
(无)
7.3.2 代码分析
分析for语句执行流程:
第一步:执行 int i = 0;
第二步:执行 i<=5;0<5条件为真,继续往下执行 ;
第三步:执行printf(“i = %d”,i);输出 i = 0;
第四步:执行i++; i=0+1,i=1;
第五步:执行i<=5;1<5条件为真,继续往下执行;
第六步:执行printf(“i = %d”,i);输出 i =1;
第七步:执行i++;i=1+1,i=2;
第八步:执行i<=5;2<5条件为真,继续往下执行;
第九步:执行printf(“i = %d”,i);输出 i =2;
第十步:执行i++;i=2+1,i=3;
第十一步:执行i<=5;3<5条件为真,继续往下执行;
第十二步:执行printf(“i = %d”,i);输出 i =3;
第十三步:执行i++;i=1+3,i=4;
第十四步:执行i<=5;4<5条件为真,继续往下执行;
第十五步:执行printf(“i = %d”,i);输出 i =4;
第十六步:执行i++;i=1+4,i=5;
第十七步:执行i<=5;5=5条件为真,继续往下执行;
第十八步:执行printf(“i = %d”,i);输出 i =5;
第十九步:执行i++;i=1+5,i=6;
第二十步:执行i<=5;6>5条件为假,退出循环;
退出for循环后,再次输出i的值为6。
这是这个程序的正向分析流程,我们看下它的反汇编是怎么体现的。
7.3.3 汇编解析
■汇编代码
;C标准库头文件和导入库
include vcIO.inc
.data
i sdword ?
.const
szMsg db "i = %d",0dh,0ah,0
.code
start:
mov i,0
NEXT:
.while i <= 5
invoke printf,offset szMsg,i
inc sdword ptr i;
jmp NEXT
.endw
;
invoke printf,offset szMsg,i
;
invoke _getch
ret
end start
●输出结果:
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
上述汇编代码使用了.while高级汇编伪指令(没有.for高级汇编伪指令),实现了C语言中的for循环语句。
结论
从本质上看,C语言中的for语句就是while语句的简化形式。“mov i,0”语句对应表达式1;条件表达式“i <= 5”对应表达式2;“inc sdword ptr i”语句对应表达式3。
■反汇编代码
int i;
for (i = 0; i <= 5; i++)
00391838 mov dword ptr [i],0 ;表达式1:初始化循环变量i=0
0039183F jmp main+3Ah (039184Ah);无条件跳转到表达式2语句
00391841 mov eax,dword ptr [i]
00391844 add eax,1 ;表达式3:变量i加一
00391847 mov dword ptr [i],eax
0039184A cmp dword ptr [i],5 ;表达式2:比较变量i和5的大小
int i;
for (i = 0; i <= 5; i++)
0039184E jg main+53h (0391863h) ;如果i>5,则跳出for循环,否则执行循环语句
{
printf("i = %d\n", i)
00391850 mov eax,dword ptr [i]
00391853 push eax
00391854 push offset string "i = %d\n" (0397B30h) ;循环语句
00391859 call _printf (039104Bh)
0039185E add esp,8
}
00391861 jmp main+31h (0391841h) ;无条件跳转到表达式3
printf("i = %d\n", i);
00391863 mov eax,dword ptr [i] ;for循环外的下一条语句
00391866 push eax
00391867 push offset string "i = %d\n" (0397B30h)
0039186C call _printf (039104Bh)
00391871 add esp,8
system("pause");
00391874 mov esi,esp
00391876 push offset string "pause" (0397B38h)
0039187B call dword ptr [__imp__system (039B168h)]
00391881 add esp,4
总结
在for语句中:
表达式1基本上是用来定义循环控制变量或者说对循环语句的开始进行控制;
表达式2一般是用来判断条件是否满足的语句,满足条件则继续执行,不满足则退出for语句;
表达式3称为步长,一般是用来控制循环次数的,;
语句块:可以做任何事情。
实验四十八: for语句表现形式1
在VS中新建项目7-3-2.c:
/*
for语句的表现形式1:省略第一个表达式
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i = 0; // 在for循环之前初始化
for (; i < 10; i++)// for语句中省去第一个表达式。但是分号不能少
{
printf("■");
}
printf("\n");
system("pause");
return 0;
}
●输出结果:
■■■■■■■■■■
请按任意键继续. . .
上述代码中的表达式1放置在for语句之前,for语句内只保留了一个’;’,其他保持不变。接下来我们通过反汇编代码观察一下这种形式的for语句的执行流程。
反汇编代码:
int i = 0; // 在for循环之前初始化
009B1838 mov dword ptr [i],0 ;表达式1前置
for (; i < 10; i++)// for语句中省去第一个表达式。但是分号不能少
009B183F jmp main+3Ah (09B184Ah)
009B1841 mov eax,dword ptr [i]
009B1844 add eax,1 ;表达式3
009B1847 mov dword ptr [i],eax
009B184A cmp dword ptr [i],0Ah ;表达式2
for (; i < 10; i++)// for语句中省去第一个表达式。但是分号不能少
009B184E jge main+4Fh (09B185Fh) ;当i>=10,退出循环
{
printf("■");
009B1850 push offset string "\xa1\xf6" (09B7B30h)
009B1855 call _printf (09B104Bh)
009B185A add esp,4
}
009B185D jmp main+31h (09B1841h) ;跳转到表达式3
printf("\n");
009B185F push offset string "\n" (09B80D8h)
009B1864 call _printf (09B104Bh)
009B1869 add esp,4
结论
由上述反汇编代码可知,表达式1前置,对应for语句的执行流程没有任何改变。
练习
- 请读者书写程序7-3-2.c伪代码,并绘制流程图。
- 请读者将7-3-2.c翻译成汇编语言实现。
- 请读者分析7-3-2.c的反汇编代码。
实验四十九: for语句表现形式2
在VS中新建项目7-3-3.c:
/*
for语句的表现形式2:省略第二个表达式
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
for (int i = 0;; i++)//变量i的作用域仅限for语句块内
{
if (i > 10)
{
break;//如果i>10则跳出循环,break是跳出for循环
}
printf("■");
}
//printf("i = %d\n",i);
system("pause");
return 0;
}
●输出结果:
■■■■■■■■■■■请按任意键继续. . .
实验四十九的代码需要注意两点:
1.变量i的定义放在了for语句内,那么变量i的作用域仅限for语句块。如果将下面的语句“printf("i = %d\n",i);”屏蔽去掉,编译时会提示错误信息“error C2065: “i”: 未声明的标识符”。在C语言中,变量是区分作用域的,也就是有效范围。如果是全局变量,则保存在全局区,在整个程序范围内都是有效的。如果局部变量定义在函数内,则保存在函数堆栈中,仅在函数内有效,函数运行结束后释放堆栈空间,局部变量也就消失了。此外还有两种类型的变量static静态变量和STL线程存储变量,这里暂不做介绍。
在C语言中,不同作用域的变量名可以相同,因为作用域不同,编译器编译时也会自动区分。
2.for语句的表达式2是一个条件表达式,其作用是控制循环结束条件。实验四十九中的代码将表达式2放置在循环语句块内,使用if语句判断条件,当i>10时,执行break语句,退出循环。break语句的作用就是退出循环,我们将在本章7.5节继续介绍break语句的使用方法。
【注】for语句中的表达式2分号不可以缺省。
接下来我们再看一下反汇编代码:
for (int i = 0;; i++)//变量i的作用域仅限for语句块内
00B01838 mov dword ptr [ebp-8],0 ;表达式1,[ebp-8]为局部变量i
for (int i = 0;; i++)//变量i的作用域仅限for语句块内
00B0183F jmp main+3Ah (0B0184Ah)
00B01841 mov eax,dword ptr [ebp-8] ;表达式3
00B01844 add eax,1
00B01847 mov dword ptr [ebp-8],eax
{
if (i > 10);表达式2
00B0184A cmp dword ptr [ebp-8],0Ah
00B0184E jle main+42h (0B01852h)
{
break;//如果i>10则跳出循环,break是跳出for循环
00B01850 jmp main+51h (0B01861h) ;退出循环
}
printf("■");循环语句
00B01852 push offset string "\xa1\xf6" (0B07B30h)
00B01857 call _printf (0B0104Bh)
00B0185C add esp,4
}
00B0185F jmp main+31h (0B01841h) ;跳转到表达式3
//printf("i = %d\n",i);
system("pause");
00B01861 mov esi,esp
上述反汇编代码中一个明显的变化就是变量i使用[ebp-8]来代替。为了进一步验证变量i的作用域,我们再做一个实验。
实验五十: for语句循环变量作用域
在VS中新建项目7-3-4.c:
/*
for语句循环变量作用域
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i = 20;//作用域main函数内有效
for (int i = 0;; i++)//变量i的作用域仅限for语句块内
{
printf("\ni = %d", i);
if (i > 10)
{
break;//如果i>10则跳出循环,break是跳出for循环
}
printf("■");
}
printf("\ni = %d\n",i);//i=20
system("pause");
return 0;
}
●输出结果:
i = 0■
i = 1■
i = 2■
i = 3■
i = 4■
i = 5■
i = 6■
i = 7■
i = 8■
i = 9■
i = 10■
i = 11
i = 20
请按任意键继续. . .
上述代码中存在两个变量i,编译时并没有报错,说明变量名符号没有冲突。再看打印信息,for语句内打印的变量i从0~11。最后一个打印输出的变量i的值为20,显然是第一个变量i的值。
请读者查看一下反汇编代码,第一个变量i使用“[i]”表示,而第二个变量i使用“[ebp-14h]表示”。其余内容和使用四十九相同,不再赘述。
实验五十一: for语句形式3
在VS中新建项目7-3-5.c:
/*
for语句形式3:缺省表达式3
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
for (int i = 0; i < 10;)
{
printf("■");
i++;
}
system("pause");
return 0;
}
●输出结果:
■■■■■■■■■■请按任意键继续. . .
上述代码将表达式3放置在循环语句块的结尾处,这应该和我们预想的一样,之前for语句的反汇编代码的执行流程就是如此。接下来我们再看一下反汇编代码的执行流程。
●反汇编代码:
for (int i = 0; i < 10;)
002D1838 mov dword ptr [ebp-8],0 ;表达式1
for (int i = 0; i < 10;)
002D183F cmp dword ptr [ebp-8],0Ah ;表达式2
002D1843 jge main+4Dh (02D185Dh) ;i>=10跳出循环
{
printf("■");循环语句
002D1845 push offset string "\xa1\xf6" (02D7B30h)
002D184A call _printf (02D104Bh)
002D184F add esp,4
i++;表达式3
002D1852 mov eax,dword ptr [ebp-8]
002D1855 add eax,1
002D1858 mov dword ptr [ebp-8],eax
}
002D185B jmp main+2Fh (02D183Fh) ;继续循环
system("pause");
002D185D mov esi,esp
上述反汇编代码和之前示例中的反汇编代码执行流程稍有不同,表达式3按照正常的代码编写顺序放置在printf语句之后。其实之前的反汇编代码也是按照代码的编写顺序进行编译的。
【注意】for (int i = 0; i < 10;)语句内的最后一个表达式’;’可以缺省。
实验五十二: for语句形式4
在VS中新建项目7-3-6.c:
/*
for语句形式4:缺省全部3个表达式
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
for (;;)
{
printf("■");
}
system("pause");
return 0;
}
●输出结果:
不停的打印■,陷入死循环。
为什么会是这样呢?因为当表达式全部置空时,相当于没有初始值,没有控制语句,没有后置表达式,那么它将永远的循环下去,直到内存溢出,这就是所谓的死循环。
●反汇编代码:
for (;;)
{
printf("■");
011E1838 push offset string "\xa1\xf6" (011E7B30h)
for (;;)
{
printf("■");
011E183D call _printf (011E104Bh)
011E1842 add esp,4
}
011E1845 jmp main+28h (011E1838h) ;跳到for语句块起始位置
system("pause");
011E1847 mov esi,esp
上述反汇编代码可以看到,程序中没有循环控制变量,没有循环结束条件,因此陷入了无限循环。我们应绝对避免此类情况的发生。
练习
1、递增显示从0到输入的正整数为止的各个整数(for语句)。
2、输入一个整数,连续显示出该整数个*(for语句)。
3、输入规定数量个整数并显示出它们的合计值和平均值。
4、编写一个程序,求1到n的和。n的值从键盘输入。
5、根据输入的整数,循环显示1234567890,显示的位数和输入的整数值相同。
请输入一个整数:25
1234567890123456789012345
6、显示输入的整数值的所有约数。
7、编写一段程序,输入一个整数值,显示该数值以下的所有奇数。
整数值:15
1 3 5 7 9 11 13 15
8、编写一段程序,输入一个整数值,显示该整数值个‘*'。每显示5个就进行换行。
显示多少个*:12
*****
*****
**
*
本文摘自编程达人系列教材《汇编的角度——C语言》。
相关文章:

【新书推荐】7.3 for语句
本节必须掌握的知识点: 示例二十四 代码分析 汇编解析 for循环嵌套语句 示例二十五 7.3.1 示例二十四 ■for语句语法形式: for(表达式1;表达式2;表达式3) { 语句块; } ●语法解析: 第一步:执行表达式1,表达式1…...
爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测
目录 背影 极限学习机 爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测 主要参数 MATLAB代码 效果图 结果分析 展望 完整代码下载链接:爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测(代码完整,数据)资源-CSDN文库 https://d…...

挑战杯 opencv 图像识别 指纹识别 - python
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于机器视觉的指纹识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖,适…...

【Docker】了解Docker Desktop桌面应用程序,TA是如何管理和运行Docker容器(2)
欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Docker容器》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…...
PHP、Python、Java 和 Go语言对比
PHP、Python、Java 和 Go 都是流行的编程语言,每种语言都有其独特的优势和适用场景。下面是对这些语言的一些基本对比: 一:PHP 适用场景:主要用于Web开发,特别是服务器端脚本。 特点:语法简单易懂&#…...
算法题目题单+题解——图论
简介 本文为自己做的一部分图论题目,作为题单列出,持续更新。 题单由题目链接和题解两部分组成,题解部分提供简洁题意,代码仓库:Kaiser-Yang/OJProblems。 对于同一个一级标题下的题目,题目难度尽可能做…...

车载测试中:如何处理 bug
一:Jira 提交 bug 包含那些内容 二:如何处理现上 bug 三:车载相关的 bug 如何定位 四:遇到 bug ,复现不出来怎么办 五:bug 的处理流程 一:Jira 提交 bug 包含那些内容二:如何处理现上…...

亲测解决vscode的debug用不了、点了没反应
这个问题在小虎登录vscode同步了设置后出现,原因是launch文件被修改或删除。解决方法是重新添加launch。 坏境配置 win11 + vscode 解决方法 Ctrl + shift + P,搜索debug添加配置: 选择python debugger。 结果生成了一个文件在当前路径: launch内容: {// Use Int…...

立足智能存取解决方案|HEGERLS智能托盘四向车储存制动能量 实现能源回收
对于商业配送和工业生产的企业而言,如何能高效率、低成本进行低分拣、运输、码垛、入库,用以提升仓库空间的利用效率,是现在大多企业急需要解决的行业痛点。对此,为了解决上述痛点,近年来,物流仓储集成商、…...
2024.2.8日总结(小程序开发5)
对上拉触底事件进行节流处理 在data中定义isloading节流阀 false表示当前没有进行任何数据请求true表示当前正在进行数据请求 在getColors()方法中修改isloading节流阀的值 在刚调用getColors时将节流阀设置true在网络请求的complete回调函数中,将节流阀重置为f…...
Spring Boot配置文件优先级
1、bat文件启动java程序 java -Dmmmqqq -Dfile.encodingUTF-8 -jar ruoyi-admin.jar --mmmiii --llllll 2、配置类型 程序参数Program arguments : --mmmiii 单个属性值,可以从String[] args读取到,放在jar包命令后面 VM参数VM options :一般以-D …...
Rust 初体验1
Rust 初体验 安装 打开官网,下载 rustup-init.exe, 选择缺省模式(1)安装。 国内源设置 在 .Cargo 目录下新建 config 文件,添加如下内容: [source.crates-io] registry "https://github.com/rus…...

【深度学习】实验7布置,图像超分辨
清华大学驭风计划 因为篇幅原因实验答案分开上传, 实验答案链接http://t.csdnimg.cn/P1yJF 如果需要更详细的实验报告或者代码可以私聊博主 有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~ 深度学习训练营 案例 7 ࿱…...

【八大排序】归并排序 | 计数排序 + 图文详解!!
📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构冒险记 ✅C语言进阶之路 🌅 有航道的人,再渺小也不会迷途。 文章目录 一、归并排序1.1 基本思想 动图演示2.2 递归版本代码实现 算法步骤2.3 非递归版本代…...

Netty应用(三) 之 NIO开发使用 网络编程 多路复用
目录 重要:logback日志的引入以及整合步骤 5.NIO的开发使用 5.1 文件操作 5.1.1 读取文件内容 5.1.2 写入文件内容 5.1.3 文件的复制 5.2 网络编程 5.2.1 accept,read阻塞的NIO编程 5.2.2 把accept,read设置成非阻塞的NIO编程 5.2.3…...
融资项目——配置redis
一、 在maven中导入相关依赖。在springboot框架中,我们使用spring data redis <!-- spring boot redis缓存引入 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifa…...

npm修改镜像源
背景:切换npm镜像源是经常遇到的事,下面记录下具体操作命令 1. 打开终端运行"npm config get registry"命令来查看当前配置的镜像源 npm config get registry2. 修改成淘宝镜像源"https://registry.npmjs.org/" npm config set re…...
K8S系列文章之 [基于 Alpine 使用 kubeadm 搭建 k8s]
先部署基础环境,然后根据官方文档 K8s - Alpine Linux,进行操作。 将官方文档整理为脚本 整理脚本时,有部分调整 #!/bin/shset -x # 添加源,安装时已经配置 #cat >> /etc/apk/repositories <<"EOF" #htt…...

JVM相关-JVM模型、垃圾回收、JVM调优
一、JVM模型 JVM内部体型划分 JVM的内部体系结构分为三部分,分别是:类加载器(ClassLoader)子系统、运行时数据区(内存)和执行引擎 1、类加载器 概念 每个JVM都有一个类加载器子系统(class l…...

提升图像分割精度:学习UNet++算法
文章目录 一、UNet 算法简介1.1 什么是 UNet 算法1.2 UNet 的优缺点1.3 UNet 在图像分割领域的应用 二、准备工作2.1 Python 环境配置2.2 相关库的安装 三、数据处理3.1 数据的获取与预处理3.2 数据的可视化与分析 四、网络结构4.1 UNet 的网络结构4.2 UNet 各层的作用 五、训练…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...