关于循环等待,跳出循环值的判断方法


1.逆推法

原理:基于不满足条件,跳出循环

int a=0;
while(a!=5)
{
	b=a;
	a++;
}

求b等于多少?此处可以用逆推法
a=5跳出循环,即上一个循环末尾a的值为5,

在这里插入图片描述

SLTNode* prev = NULL;
SLTNode* tail = *pphead;
while (tail->next != NULL)
{
	prev = tail;
	tail = tail->next;
}

free(tail);
prev->next = NULL;
问:prev为链表的那个节点?逆推法最好用

在这里插入图片描述

int a=0;
while(a!=5)
{
	b=a;
	a++;
	if(b=2)
	{
	   pirnt(a)
	}
}

在这里插入图片描述

2. 顺序法

 初始值为 0  然后a++  a!=7
 则在循环内部  a的范围为0~67的前一位)

int a=0;
while(a!=7)
{
	b=a;
	print("%d",b)//0 1 2 3 4 5 6
	a++;
}
 初始值为 9  然后a--  a!=5
 则在循环内部  a的范围为9 8 7 65的前一位)
 9>=a>5  9(包含)~5(不包含)


向前走,走的7位置后,逆着原方向走一位,

95流动,5为阻截点。流到6就截止了。
int a=9;
while(a!=5)
{
	b=a;
	print("%d",b)//9   8 7 6 **5**
	a--;// a的值为 8 7 6 5
}

在这里插入图片描述

在这里插入图片描述
二种方法都可以用,谁好用谁。

最快的方法是,逆推法找最后一个循环结束的值,
顺序法找a的第一个循环结束值。
当然当循环简单,没必要使用,复杂时,可以采用此方法

3.模拟法

需要实现代码更具体细节,可用此方法。

4.while的一些特殊用法

while(k–) k次循环

	int a = 9;
	while (a--)
	{
		printf("%d\n", a);  //(8,7,6,5,4,3,2,1,0)  
		//a-1次循环
	}

while(–k) k-1次循环

	int a = 9;
	while (--a)
	{
		printf("%d\n", a);  //(8,7,6,5,4,3,2,1)  
		//a-1次循环
	}

条件A为0(为假命题),则等效于条件A的取反为真命题。

//死循环,怎么快速判断呢?

int a = 9;
int b = 0;

while (a!=2 || b!=12 )
{
	printf("a=%d b=%d\n", a,b); 
	a--;
	b++;
}

关于命题的概念,如果a为真命题,则~a必定为假命题。
(a!=2 || b!=12 ) 为 假命题(即值为0)
则~(a!=2 || b!=12 )为真命题 则a=2 && b=12

int a = 9;
int b = 0;

while (a!=2 && b!=12 )
{
	printf("a=%d b=%d\n", a,b); 
	a--;
	b++;
}

~(a!=2 && b!=12 ) a=2或者 b=12 都可以 跳出循环
总结:想跳出循环,对条件取反即可。

while(L1!=NULL && L2!=NULL)

怎么样会继续执行呢?
L1不为空和L2不为空,也就是二个都不为空,都成立 才能继续
那么至少有一个为空,就会跳出循环

原理:条件A&&条件B
为1 必要条件 为A和B 都成立 (且)
为0 必要条件 为A和B 至少有一个条件不成立(存在不成立,有几个不成立,可以都不成立)

原理:条件A||条件B
为1 必要条件 为A和B 至少有一个条件成立 (或)
为0 必要条件 为A和B 都不成立

while(L1!=NULL || L2!=NULL)

L1不为空或L2不为空,L1和L2有至少一个不为空,都成立
当二个都不为空,就会跳出循环。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们希望(pos < ps->size || pos>0) 为真
但是assert接受为假的命题才执行,也就说(pos < ps->size || pos>0) 为真命题 把其等效转换成
!(pos < ps->size || pos>0)为假命题,这样就可以执行异常了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值