你真的懂break和continue吗?这篇文章让你明白
前言:
?????? 剛上大一初學(xué)C語言的同學(xué)們往往對(duì)break,continue感到陌生,在做學(xué)校實(shí)驗(yàn)題以及一些題目遇到循環(huán)沒有很好的利用或者想到使用這兩個(gè)語句。其實(shí),如果能用好他們,往往能省很多事。
知識(shí)點(diǎn):
?????? 先簡單解釋一下這兩個(gè)語句分別的作用
一般來說,進(jìn)入循環(huán)體(分別為for循環(huán),while循環(huán),do..while循環(huán))之后,在下次循環(huán)判斷之前程序
執(zhí)行循環(huán)體中的所有語句。而continue和break可以根據(jù)循環(huán)體內(nèi)部進(jìn)行的判斷結(jié)果來忽略部分循環(huán)甚至終止它。
Continue:當(dāng)執(zhí)行這條語句的時(shí)候,continue之后的語句都會(huì)被忽略。直接跳到下一次循環(huán),
如果continue是在雙重循環(huán)的內(nèi)層循環(huán),那么它只會(huì)影響包含它最里層的結(jié)構(gòu)。
第二個(gè)用途是continue充當(dāng)占位符,最過于典型的例子就是這個(gè)
while((ch = getchar()) != '\n'){continue; }如果整個(gè)循環(huán)只是用來讀取字符而不做其他處理,使用continue來代替原本的空語句';',會(huì)使代碼更加整潔可讀。?
注意:continue語句執(zhí)行后,對(duì)于while和do..while下一個(gè)要執(zhí)行的是循環(huán)的判斷條件。
? ? ? ? 而對(duì)于for循環(huán)來說,下一個(gè)要執(zhí)行的是更新部分,然后再求循環(huán)判斷條件
Break:break是相對(duì)與continue而言的,與其的區(qū)別是break是跳出循環(huán),而continue是跳到下一次循環(huán)。在雙重循環(huán)的嵌套使用中,常用于跳出內(nèi)層循環(huán)
for(int i = 0 ; i < m ; i++){for(int j = 0 ; j < n ; j++){if(j == m)break;} }執(zhí)行break后,關(guān)于j的loop將被跳過,更新一次i的值,判斷是否再進(jìn)入i的loop。
語法錯(cuò)誤:break,continue只能在循環(huán)或開關(guān)中使用
????????錯(cuò)誤原因:循環(huán)體加了“;”
?
下面是道例題去看看continue和break在循環(huán)里的運(yùn)用,你們也可以自己先動(dòng)手做做看能不能實(shí)現(xiàn)。
尋找鞍點(diǎn)
編寫一個(gè)C程序,實(shí)現(xiàn)以下功能:
???輸入一個(gè)二維整數(shù)數(shù)組(n行, m列),則該二維整型數(shù)組中可能存在以下特征的數(shù)組元素:它在其所在的行中值是最大的,它在其所在的列中的值是最小的。我們稱之為鞍點(diǎn)
如果數(shù)組中存在這樣的數(shù)組元素,請(qǐng)輸出該元素的行號(hào)和列號(hào);如果數(shù)組中不存在這樣的數(shù)組元素,則輸出“不存在該特征的元素”。
這題說難不難,但很多剛剛接觸C的同學(xué)往往會(huì)把打印printf放在循環(huán)內(nèi)部去執(zhí)行。這樣會(huì)導(dǎo)致打印多次,但如果把printf放在外面,又不知如何把循環(huán)內(nèi)的值傳到外頭。
思路就是在一行中尋找最大的值,然后記錄該點(diǎn)的縱坐標(biāo),執(zhí)行完之后把flag標(biāo)記成true。再去尋找該縱里是否這個(gè)點(diǎn)為最小。如果存在更小,flag更新成false。
通過一個(gè)flag的bool狀態(tài)量來不斷確定是否目前的值屬于鞍點(diǎn)。之后用if(flag)判斷打印鞍點(diǎn)
但是,怎么讓if判斷只執(zhí)行一次呢?之前找我問這道題同學(xué)想到了定義一個(gè)計(jì)數(shù)變量來統(tǒng)計(jì)if執(zhí)行的次數(shù),如果if執(zhí)行0次,就證明了不存在鞍點(diǎn)。這種想法很好,但如果轉(zhuǎn)換思維,想到if(flag)是在循環(huán)內(nèi)部執(zhí)行的。只要在if(flag)里面寫入一個(gè)break語句,就能在執(zhí)行之后跳出循環(huán),達(dá)到只打印一次。
答案
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdbool.h> #define MAX 20 int main() {int n, m, max,maxj,i,j;int arr[MAX][MAX];bool flag;scanf("%d%d", &n, &m);for (i = 0; i < n; i++) {for (j = 0; j < m; j++) {scanf("%d", &arr[i][j]);}}for (i = 0; i < n; i++) {max = arr[i][0]; maxj = 0;//初始化;for (j = 0; j < m; j++) {if (arr[i][j] > max) {max = arr[i][j];maxj = j;//最大組號(hào)和列號(hào)保存;}}flag = true;for (int k = 0; k < n; k++) {if (max > arr[k][maxj]) {flag = false;continue;}}if (flag) {printf("%d %d", i, maxj);break;}}if(!flag)printf("不存在該特征的元素"); }這段代碼最為細(xì)節(jié)的點(diǎn)就是將一個(gè)打印函數(shù)
if(flag) {printf("%d %d",i,maxj);break; }放在循環(huán)內(nèi)部,如果if條件符合,則執(zhí)行printf ,之后break跳出i的loop結(jié)束循環(huán)。
如果我們把這段話的break刪去會(huì)怎樣
if(flag) {printf("%d %d",i,maxj); }執(zhí)行結(jié)果
鞍點(diǎn)打印出來了,但為什么把外層循環(huán)的if(!flag)也執(zhí)行了呢?,此時(shí)flag不應(yīng)該為真嗎?
其實(shí)此flag非flag,如果沒有break來跳出循環(huán),if執(zhí)行了之后依然在循環(huán)里,程序會(huì)一直執(zhí)行到最后結(jié)束循環(huán)才能執(zhí)行下面的
if(!flag)printf("不存在該特征的元素\n");?而此時(shí)當(dāng)然flag為假拉,除非鞍點(diǎn)剛好就在最后一行最后一列。
新手常犯的錯(cuò)誤有:把判斷打印放在循環(huán)內(nèi)部
for (i = 0; i < MAXi; i++) {max = arr[i][0]; maxj = 0; //初始化;for (j = 0; j < MAXj; j++) {if (arr[i][j] > max) {max = arr[i][j];maxj = j;//最大組號(hào)和列號(hào)保存;}}flag = true;for (int k = 0; k < MAXi; k++) {if (max > arr[k][maxj]) {flag = false;}}if (flag) {printf("%d %d\n",i + 1, maxj + 1);break;}elseprintf("不存在該特征的元素\n");}? 結(jié)果
? ? ??
所有知識(shí)點(diǎn)都不能一下子就掌握,都是需要大量的練習(xí)和受挫才能學(xué)會(huì)的,我也在不斷的成長,在這個(gè)平臺(tái)傳輸一點(diǎn)自己的挫見。如果有錯(cuò)誤,希望大佬們?cè)谠u(píng)論區(qū)謬誤,十分感謝。
總結(jié)
以上是生活随笔為你收集整理的你真的懂break和continue吗?这篇文章让你明白的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux脚本语言求累加和,Linux
- 下一篇: 图书馆管理系统怎么做_亚马逊erp管理系