if…else语句
程序在执行的时候都是一行一行执行的,例如下面这行代码:
#include <stdio.h> //头文件
#include <windows.h>
void main() //程序入口
{
int x = 10; //赋值
int y = 20;
printf("x>y \n"); //输出结果
return; //程序结束
}
如果我们想要让程序按照我们的意思来执行,就要使用两个语句:一个是分支语句(if),一个是循环语句(while),这篇文章主要说一下if语句。
if语句格式:
if(表达式)
语句;
else
语句;
或者
if(表达式)
{
语句1;
语句2;
}
else
{
语句1;
语句2;
}
例子:
#include <stdio.h> //头文件
#include <windows.h>
void main() //程序入口
{
int x = 10; //赋值
int y = 20;
if(x>y) //进行判断
printf("x>y \n"); //输出判断结果
else //若不符合上面的判断条件输出下面的结果
printf("x<y \n");
return; //程序结束
}
运行结果:
或者:
#include <stdio.h> //头文件
#include <windows.h>
void main() //程序入口
{
int x = 10; //赋值
int y = 20;
if(x>y) //进行判断
{
printf("*****计算结果为*****\n"); //输出判断结果
printf("x>y \n");
}
else //若不符合上面的判断条件输出下面的结果
{
printf("*****计算结果为*****\n");
printf("x<y \n");
}
printf("程序结束!\n"); //输出结束语
return; //程序结束
}
if…else if…else if…else
这个就比较复杂了,如果第一次判断不成立,那么就会进行第二次判断、第三次判断等等,如果都不成立,那么就会输出else的语句。
格式
if(表达式)
{
语句1;
}
else if(表达式)
{
语句2;
}
else if(表达式)
{
语句3;
}
else
{
语句4;
}
例子:
#include <stdio.h> //头文件
#include <windows.h>
void main() //程序入口
{
int x = 10; //变量赋值
if(x>11) //第一次判断
{
printf("A \n"); //若成立输出语句
}
else if(x<10) //第二次判断
{
printf("B \n"); //若成立输出语句
}
else if(x=10) //第三次判断
{
printf("C \n"); //若成立输出语句
}
else //若前三次判断都不成立,输出else语句
{
printf("D \n");
}
printf("程序结束! \n"); //输出结束语
return; //程序结束
}
运行结果:
if语句嵌套
格式
if(表达式)
{
if...
}
else
{
if..
}
这里举一个例子,要求实现输出三个数中的最大数:
#include <stdio.h> //头文件
#include <windows.h>
int Max(int x,int y,int z) //定义函数Max
{
int r = 0; //定义一个可以储存返回值的变量r
if(x>y) //判断若成立执行下面的if语句
{
if(x>z) //若成立把值赋给r
{
r = x;
}
else //否则执行else语句
{
r = z; //把值赋给r
}
}
else //若上面的都不成立则执行else语句
{
if(y>z) //同上
{
r = y;
}
else
{
r = z;
}
}
return r; //把值返回到r里
}
void main() //程序入口
{
int key = Max(1,2,3); //往函数里传参数
printf("最大数为:%d\n",key); //输出最终结果
return; //程序结束
}
运行效果:
扫描二维码关注公众号,回复:
10401466 查看本文章
从底层分析if语句
我们看一下if语句在汇编里究竟是怎么实现的,先上一段代码:
#include <stdio.h> //头文件
#include <windows.h>
void main() //程序入口
{
int x = 10; //赋值
int y = 20;
if(x>y) //执行判断
{
printf("x>y"); //输出结果
}
else //判断不成立执行else语句
{
printf("x<y"); //输出结果
}
return; //程序结束
}
这是它的汇编代码:
先分析if语句
if(x>y)
{
printf("x>y");
}
汇编指令:
mov eax,dword ptr [ebp-4] //把10传到eax里
cmp eax,dword ptr [ebp-8] //10与20进行比较
jle main+3Dh (0040d73d) //若结果小于等于则跳转
push offset string "x>y" (0042201c) //压入字符串
call printf (00401070) //调用printf()函数
add esp,4 //外平栈进行堆栈平衡
这里明显会跳,10小于20,这里如果跳的话,就跳到这段else代码了:
else
{
printf("x<y");
}
汇编指令:
jmp main+4Ah (0040d74a) //无条件跳转,这里不会跳,因为上面的jie跳过它了
push offset string "%d\n" (00422fb4) //压入字符串
call printf (00401070) //调用printf()函数
add esp,4 //外平栈进行堆栈平衡
程序运行到else就会输出结果到控制台了,这里主要是体会jie与jmp的逻辑关系,jie实现了跳转,程序就会输出x<y,如果没有执行跳转,那么就会输出x<y,然后跳过else语句,假如这是一个注册机制的话,那这里就是一个突破口。
逆一下自己的程序
还是以这段代码为例,这里明明10小于20,我们让它输出x>y,也就是10>20。
#include <stdio.h> //头文件
#include <windows.h>
void main() //程序入口
{
int x = 10; //赋值
int y = 20;
if(x>y) //执行判断
{
printf("x>y"); //输出结果
}
else //判断不成立执行else语句
{
printf("x<y"); //输出结果
}
return; //程序结束
}
我们先在断尾下断,不然程序闪一下就没了,然后搜一下关键字来到程序判断的地方。
我们把这里的jle改为je,也就是相等时则跳转,这里明显不相等,所以不会挑。
然后单步往下走,看下结果:
这样就成功的让10>20了,下面的else语句也在程序执行到jmp指令的时候跳过了。如果这段代码是实现充值或者注册的话,结果就可想而知了。