一、循环语句格式
1.do while
-
执行效率最高,后面分析反汇编时具体讲解
-
格式:
do{ //执行代码 }while(表达式)
2.while
-
执行效率中等
-
格式:
while(表达式){ //执行代码 }
3.for
-
执行效率最低
-
格式:
for(表达式1;表达式2;表达式3){ //执行的代码 } for(;;){ //表达式没有的地方可以省略,但是分号不能省略 //执行的代码 } -
执行顺序:
- 先执行表达式1赋初值–>判断表达式2–>不成立则退出循环;成立则执行代码部分
- 代码执行完–>执行表达式3–>判断表达式2–>不成立则退出循环;成立则执行代码部分
- 代码执行完–>执行表达式3–>判断表达式2–>不成立则退出循环;成立则执行代码部分
- …
二、循环语句的练习
-
将两个变量的值交换
#include "stdafx.h" void Func(int x,int y){ //方法一: int temp; temp = x; x = y; y = temp; /*方法二: x = y + x; y = x - y; x = x - y; */ printf("%d - %d",x,y); } void main(int argc,char* argv[]){ Func(); getchar(); //单独使用getchar表示等待用户输入任意字符,在没输入时,程序会停在这等待,起到一个暂停的 作用,方便我们观察函数的结果 } -
将一个数组中的数倒序输出
#include "stdafx.h" void Func(){ int arr[5] = {1,4,3,2,5}; for(int i = 4;i >= 0;i--){ printf("%d ",arr[i]); } } void main(int argc,char* argv[]){ Func(); getchar(); } -
找出数组里面最大的值,并返回
#include "stdafx.h" int Func(){ int arr[5] = {1,4,57,878,53}; //数组长度:int length = sizeof(arr) / sizeof(arr[0]) int max = arr[0]; for(int i = 1;i < 5;i++){ if(arr[i] > arr[i - 1]){ max = arr[i]; } } return max; } void main(int argc,char* argv[]){ int max = Func(); printf("%d",max); getchar(); } -
将数组所有的元素相加,将结果返回
#include "stdafx.h" int Func(){ int sum = 0; int arr[6] = {1,2,3,4,5,6}; for(int i = 0;i < 6;i++){ sum += arr[i]; } return sum; } void main(int argc,char* argv[]){ int sum = Func(); printf("%d",sum); getchar(); } -
打印一个数组中的所有值
#include "stdafx.h" void Func(){ int arr[10] = {1,2,4,5,2,23,4,53,3}; //最后一值为0 int i = 0; while(i < 10){ printf("%d ",arr[i++]); } } void main(int argc,char* argv[]){ Func(); getchar(); } -
将两个等长数组相同位置的值相加,存储到另外一个等长的数组中
#include "stdafx.h" void Func(){ int arr1[8] = {1,3,4,2}; //没有赋初始值的元素默认为0 int arr2[8] = {7,4,2,5,6,4}; //没有赋初始值的元素默认为0 int arrnew[8]; for(int i = 0;i < 8;i++){ arrnew[i] = arr1[i] + arr2[i]; printf("%d ",arrnew[i]); //顺便打印了,8 7 6 7 6 4 0 0 } } void main(int argc,char* argv[]){ Func(); getchar(); } -
写一个函数int prime(int x),如果x是素数返回值为1,否则返回0
#include "stdafx.h" #include<math.h> int prime(int x){ /*方法一: for(int i = 2;i < x;i++){ if(x % i == 0){ return 0; } } return 1; */ //方法二: for(int i = 2;i < sqrt(x);i++){ if(x % i == 0){ return 0; } } return 1; } void main(int argc,char* argv[]){ int isPrime = prime(17); printf("%d",isPrime); getchar(); } -
俩俩比较数组的值,将最大的一个存储到数组的最后一个位置
#include "stdafx.h" void Func(){ int arr[10] = {4,2,1,2,445,5,64663,6,63,7}; int temp; for(int i = 0;i < 9;i++){ if(arr[i] > arr[i + 1]){ temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } for(i = 0;i < 10;i++){ printf("%d ",arr[i]); } } void main(int argc,char* argv[]){ Func(); getchar(); } -
判断数组是否是对称的,如果是返回1,不是返回0
#include "stdafx.h" int Func(){ int arr[5] = {1,2,3,2,1}; for(int i = 0,int j = sizeof(arr)/sizeof(arr[0]) - 1;i <= j;i++,j--){ //判断数组元素个数 if(arr[i] != arr[j]){ return 0; } } return 1; } void main(int argc,char* argv[]){ int is = Func(); printf("%d",is); getchar(); } //这里注意一个问题,如果将数组作为参数传入Func函数,那么会传入数组指针,此时如果用sizeof(arr)计算出来,就是指针的长度4字节,而不是整个数组的长度了!所以如果要把要判断的数组用参数传入Func中,最好在Func外面提前把sizeof(arr)算出来,也当做参数传入Func函数 -
编写程序实现一个冒泡排序的算法
#include "stdafx.h" void Func(){ int arr[10] = {1,2,4,23,24,45,64,45,6,23}; int temp; for(int i = 0;i < sizeof(arr)/sizeof(arr[0]) - 1;i++){ for(int j = 0;j < sizeof(arr)/sizeof(arr[0]) - i - 1;j++){ if(arr[j] > arr[j + 1]){ temp = arr[j]; arr[j] = arr[j +1]; arr[j + 1] = temp; } } } for(i = 0;i < sizeof(arr)/sizeof(arr[0]) - 1;i++){ printf("%d ",arr[i]); } } void main(int argc,char* argv[]){ Func(); getchar(); }
三、循环语句反汇编
1.do while
-
根据条件跳转指令所跳转到的地址,可以得到循环语句块的起始地址
-
根据条件跳转指令所在的地址,可以得到循环语句块的结束地址
-
条件跳转的逻辑与源码相同
-
反汇编格式如下:
-
举例:
void Fun(int x,int y){ do{ printf("%d\n",x); x++; }while(x>y); }
2.while
-
根据jmp 指令所跳转到的地址,可以得到循环语句块的起始地址
-
根据条件跳转指令所跳转到的地址,可以得到循环语句块的结束地址
-
在还原while 比较时,条件跳转的逻辑与源码相反
-
反汇编格式如下:
-
举例:
void Fun(int x,int y){ while(x<y){ printf("%d\n",x); x++; } }
3.for
-
第一个jmp 指令之前为赋初值部分
-
第一个jmp 指令所跳转的地址为循环条件判定部分起始
-
条件跳转的逻辑与源码相反,即判断条件后面的跳转指令条件成立时跳转到循环体外面
-
条件判断跳转指令所指向的地址上面有一个jmp,jmp地址为表达式3的起始位置
-
举例:
void Fun(int x,int y){ for(int i=x;i<y;i++){ printf("%d\n",i); } }
本文详细解析了do-while、while和for三种循环结构的执行效率及反汇编原理,并通过实例展示了如何交换变量值、倒序数组、查找最大值等。深入理解并掌握了这些技巧,能有效提升代码编写效率和程序理解能力。
1825

被折叠的 条评论
为什么被折叠?



