break与continue详解

本文详细介绍了C语言中break和continue在for、while和dowhile循环中的作用,break用于永久终止循环,continue则用于跳过本次循环并继续判断。通过实例演示了它们的区别和可能产生的效果,包括死循环的情况。
该文章已生成可运行项目,

前言:break和continue的作用

        在循环执行的过程中,如果发生某些状况的时候,需要提前终止循环,这是非常常见的现象。C语言提供了breakcontinue两个关键字,就是应用到循环中的。

总:break和continue在for循环,while循环和dowhile循环中的区别

  1. break       break在所有循环中作用几乎都一样,都用于永久终止循环,但只跳出break外的第一层循环 。
  2. continue    continue在while循环和do while循环中的作用几乎一样,循环调整的位置不同,会产生不同的效果,有可能造成死循环;在for循环中,由于循环调整的位置固定,continue的效果是一样的。

下面进行一一举例说明:

一.while循环中的break和continue

1.break举例

#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;//当i=5后,就执行break,循环就终止了
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

运行结果: 

打印了1 2 3 4后,当i等于5时,循环在break的地方终于,不在打印,不再循环。

所以break的作用就是永久终止循环,只有break被执行,break外的第一层循环就终止了。 

2.continue举例

        continue是继续的意思,在循环中的作用就是跳过本次循环continue后面的代码,继续进行下一次循环的判断。

上面的代码,如果把break换成continue会是什么结果呢?

#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
            //当i=5后,就执行continue,直接跳过continued代码,去循环的判断的地方
            //因为这里跳过了i=i+;所以i一直等于5,程序陷入死循环
		printf("%d ", i);
		i++;
	}
	return 0;
}

运行结果:程序陷入死循环 

        但不是while循环中的所有continue都会造成死循环。接下来,我们调换一下i++(循环的调整)的位置,就会得到不同的效果:

#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
    	i++;//i进入循环后加1,等于2,跳过1,打印2
		if (i == 5)
			continue;//当i等于5时,跳过后面的代码,进入判断条件,后加1,i=6
        
		printf("%d ", i);//当打印10后,进入判断语句,为真,继续循环,打印11
		}
	return 0;
}

运行结果:

        到这里我们就能分析出来,continue可以帮助我们跳过某一次continue后边的代码,直接到循环的判断部分,进行下一次循环的判断,如果循环的调整是在continue后边的话,可能会造成死循环。 

(循环详解:后期会出)

二.for循环中break和continue

1.break举例

        和while循环中的break一样,for循环中的break也用于彻底终止循环。

#include<stdio.h>
int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;
		printf("%d ", i);
	}
	return 0;
}

运行结果: 

2.continue举例

        同样,把上述代码中的break替换成continue

#include<stdio.h>
int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;//这里continue跳过后边的打印,来到i++的调整部分
		printf("%d ", i);
	}
	return 0;
}

运行结果: 

这就相当于while循环continue的第二个例子

练习: 程序的输出结果是?

#include <stdio.h>
int main()
{
	int a = 0, b = 0;
	for (a = 1, b = 1; a <= 100; a++)
	{
		if (b >= 20) break;
		if (b % 3 == 1)
		{
			b = b + 3;
			continue;
		}
		b = b-5;
	}
	printf("%d\n", a);
	return 0;
}

 答案:8

三.do while语句中的break和continue

        do while语句中的break和continue的作用和while循环中的几乎一模一样。

1.break举例

#include<stdio.h>
int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	} while (i <= 10);
	return 0;
}

 运行结果:

2.continue举例 

#include<stdio.h>
int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i = i + 1;
	} while (i <= 10);
	return 0;
}

 运行结果:(死循环)

                欢迎斧正!!! 

期待

本文章已经生成可运行项目
<think>嗯,用户现在问的是关于“Continue”的问题。之前他们问了关于MFC中循环处理当值为0时跳过执行的情况,我给出了三种方案,其中在方案1里用了continue语句。现在用户可能想进一步了解continue在编程中的具体用法,或者是在MFC环境下的应用细节。 首先,我要确定用户的需求。他们可能是在学习MFC的过程中遇到了continue的使用,或者是在编写循环结构时遇到了问题。需要解释continue的基本作用,以及在不同循环结构中的使用场景。同时,结合之前的MFC例子,说明在MFC中如何正确使用continue,特别是在多线程或定时器中的注意事项。 用户可能对continuebreak的区别不太清楚,所以需要对比两者的不同。另外,在MFC中,主线程中使用阻塞循环会导致界面冻结,这时候用continue可能不够,需要结合其他方法如定时器或消息循环,这部分需要强调。 还要考虑用户的实际应用场景。比如在数据处理、事件响应中如何合理使用continue来优化代码结构,避免死循环或资源占用过高的问题。可能还需要给出一些常见错误示例,比如忘记更新循环变量导致无限循环,或者在不支持continue的循环结构中使用它。 另外,用户可能对在MFC的特定环境下continue的使用有疑问,比如在工作线程界面线程中的不同表现,是否需要同步机制等。这时候需要结合MFC的框架特点,给出相应的建议代码示例,确保线程安全界面响应。 最后,总结continue的关键点,强调在MFC中正确使用循环控制结构的重要性,避免常见的陷阱,并提供进一步学习的资源或相关函数,帮助用户深入理解。</think>在MFC编程中,`continue` 是流程控制语句的常用方式,以下是其在循环结构中的具体应用指南: **一、基础语法特征** ```cpp while(condition1) { // 前置操作 if(condition2) { continue; // 跳过本轮剩余代码 } // 后续操作(当condition2为真时不会执行) } ``` **二、MFC典型应用场景** 1. **数据过滤处理** ```cpp void CDataProcessor::ProcessRecords() { int nCount = m_array.GetSize(); for(int i=0; i<nCount; ++i) { if(m_array[i].nStatus == 0) { // 状态为0的记录跳过 m_log.AddString(_T("发现无效记录,索引:") + IntToStr(i)); continue; } // 有效记录处理流程 ParseData(m_array[i]); } } ``` 2. **界面控件遍历** ```cpp void CMyDialog::UpdateControls() { CWnd* pChild = GetWindow(GW_CHILD); while(pChild) { if(!pChild->IsWindowVisible()) { // 跳过隐藏控件 pChild = pChild->GetNextWindow(); continue; } // 更新可见控件内容 pChild->SetWindowText(m_strDefault); pChild = pChild->GetNextWindow(); } } ``` 3. **异步任务调度** ```cpp UINT CWorkerThread::Run() { while(m_bRunning) { if(::WaitForSingleObject(m_hCancelEvent, 0) == WAIT_OBJECT_0) { continue; // 收到取消信号时跳过处理 } // 正常任务执行 ExecuteTask(); // 防止CPU过载 ::Sleep(100); } return 0; } ``` **三、进阶使用技巧** 1. **嵌套循环控制** ```cpp for(int i=0; i<10; ++i) { while(GetData(i)) { if(CheckError(i)) { continue; // 仅影响内层while循环 } ProcessItem(i); } } ``` 2. **异常处理结合** ```cpp try { for(auto& item : m_vecItems) { if(item.IsNull()) continue; // 可能抛出异常的操作 item.Transform(); } } catch(CMemoryException* e) { e->Delete(); AfxMessageBox(_T("内存操作异常")); } ``` **四、MFC特殊注意事项** 1. **消息泵维护**(主线程循环中必须保留): ```cpp // 错误方式(导致界面冻结) while(condition) { if(bSkip) continue; // 缺少消息处理 } // 正确方式 while(condition) { if(bSkip) continue; MSG msg; while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } ``` 2. **定时器的配合**: ```cpp void CMyView::OnTimer(UINT_PTR nIDEvent) { if(nIDEvent == TIMER_PROCESS) { if(m_nCounter++ % 5 == 0) { // 每5次执行一次 continue; // 此处无效!定时器回调不能使用continue } // 正确做法应使用条件判断 if(m_nCounter % 5 != 0) { DoComplexCalculation(); } } CView::OnTimer(nIDEvent); } ``` **五、性能优化建议** 1. **减少条件判断频率**: ```cpp // 优化前 for(int i=0; i<10000; ++i) { if(ShouldSkip(i)) continue; // ... } // 优化后(提前过滤) std::vector<int> validIndices; for(int i=0; i<10000; ++i) { if(!ShouldSkip(i)) validIndices.push_back(i); } for(int idx : validIndices) { // 无跳过逻辑 } ``` 2. **多线程环境同步**: ```cpp // 工作线程 UINT ThreadProc(LPVOID pParam) { auto pObj = (CMyClass*)pParam; while(pObj->IsRunning()) { CSingleLock lock(&pObj->m_cs, TRUE); // 进入临界区 if(pObj->m_queue.empty()) { continue; // 队列为空时继续等待 } auto data = pObj->m_queue.front(); pObj->m_queue.pop(); lock.Unlock(); // 及时释放锁 ProcessData(data); } return 0; } ``` **六、调试技巧** 1. 设置条件断点: - 在VS调试器中右键断点 → 条件设置:`i == 5 && shouldSkip == true` 2. 输出调试信息: ```cpp TRACE(_T("跳过索引 %d,原因:%s\n"), nIndex, GetSkipReason(nIndex)); ``` 3. 使用ASSERT验证: ```cpp while(pItem) { ASSERT_VALID(pItem); // 验证对象有效性 if(pItem->IsInvalid()) continue; // ... } ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值