C语言中的分支语句(if语句)

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指令的时候跳过了。如果这段代码是实现充值或者注册的话,结果就可想而知了。

发布了60 篇原创文章 · 获赞 68 · 访问量 8406

猜你喜欢

转载自blog.csdn.net/qq_43573676/article/details/104978135