C語(yǔ)言簡(jiǎn)明分析選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的使用
一、程序中的選擇結(jié)構(gòu)(if)
if的用法
上代碼:
#include <stdio.h> int main() { short a = 1; short b = 2; int c = a - b; if( c > 0 ) { printf("a > b\n"); } else { printf("a <= b\n"); } return 0; }
下面為輸出結(jié)果:
if ... else ...剪裁與組合
裁剪
- if 可以不帶 else 分支,條件為真時(shí),則執(zhí)行對(duì)應(yīng)的語(yǔ)句
- if 和 else 都可以不使用 { } ,此時(shí)每個(gè)分支只對(duì)應(yīng)一條語(yǔ)句
組合
- else 后的語(yǔ)句可以是另一個(gè) if ...else ...
- 多個(gè) if ...else ...組合在一起可描述多路選擇分支
上代碼:
#include <stdio.h> int main() { short a = 2; short b = 2; int c = a - b; if( c > 0 ) printf("a > b\n"); else if( c == 0 ) printf("a == b\n"); else printf("a < b\n"); return 0; }
下面為輸出結(jié)果:
小結(jié)
- 分支結(jié)構(gòu)是程序設(shè)計(jì)語(yǔ)言中的重要結(jié)構(gòu)
- C語(yǔ)言中通過(guò) if ...else ...對(duì)代碼進(jìn)行分支執(zhí)行
- 可以對(duì) if ... else ...進(jìn)行剪裁和組合,描述更多的執(zhí)行分支
- if 分支可以獨(dú)立存在,else 分支不能獨(dú)立存在,必須跟在 if 之后
- else 和最近的 if 匹配(就近原則)
二、switch多分支選擇語(yǔ)句
switch-更簡(jiǎn)潔的多分支選擇結(jié)構(gòu)
上代碼:
#include <stdio.h> int main() { int a = 1; int b = 2; char sign = 0; printf("Input a sign: "); scanf("%c", &sign); switch(sign) { case '+': printf("%d + %d = %d\n", a, b, a + b); break; case '-': printf("%d - %d = %d\n", a, b, a - b); break; case '*': printf("%d * %d = %d\n", a, b, a * b); break; default: printf("Unsupported Sign: %c\n", sign); } return 0; }
下面為輸出結(jié)果:
switch 實(shí)驗(yàn)小結(jié)
- switch 僅能適用于離散變量或值(整數(shù)值)
- case 是分支入口,匹配成功后執(zhí)行 case 下的語(yǔ)句
- 當(dāng)語(yǔ)句全部執(zhí)行后,需要使用 break 跳出執(zhí)行分支
- default 分支不是必須的(類似于 else 分支不是必須的)
switch 語(yǔ)句的分支合并技巧
上代碼:
#include <stdio.h> int main() { int num = 0; printf("Input a number: "); scanf("%d", &num); switch( num ) { case 1: case 2: case 3: case 4: case 5: printf("%c\n", 'A' + (num - 1)); break; default: printf("Invalid Input\n"); } return 0; }
下面為輸出結(jié)果:
小結(jié)
- switch 是一種更簡(jiǎn)潔的分支選擇結(jié)構(gòu)
- switch 僅能適用于整數(shù)(小數(shù)不可用)
- case 是分支入口,匹配成功后執(zhí)行case下的語(yǔ)句
- 當(dāng)語(yǔ)句全部執(zhí)行后,需要使用 break 跳出執(zhí)行分支
- 多個(gè) case 可合并在一起,執(zhí)行相同的語(yǔ)句
三、while循環(huán)結(jié)構(gòu)
while - 循環(huán)結(jié)構(gòu)的直接支持
上代碼:
#include <stdio.h> int main() { int sum = 0; int i = 1; while( i <= 100 ) { sum = sum + i; i = i + 1; } printf("sum = %d\n", sum); printf("i = %d\n", i); return 0; }
下面為輸出結(jié)果:
進(jìn)階while循環(huán)
- 循環(huán)體可能一次也不執(zhí)行(如: while( 0 ) )
- 循環(huán)條件必須被改變,否則循環(huán)永遠(yuǎn)不會(huì)結(jié)束(如:while( 1 ) )
- if 語(yǔ)句(不帶 else )可以看作特殊的循環(huán)(最多執(zhí)行1次循環(huán)體)
- if 語(yǔ)句與 while 語(yǔ)句可相互組合嵌套實(shí)現(xiàn)復(fù)雜功能
上代碼:
#include <stdio.h> int main() { int sum = 0; int i = 1; while( i <= 1000 ) { if( (i % 3) == 0 ) { sum = sum + i; printf("i = %d\n", i); } i = i + 1; } printf("sum = %d\n", sum); return 0; }
下面為部分輸出結(jié)果:
小結(jié)
- 循環(huán)結(jié)構(gòu)是程序設(shè)計(jì)語(yǔ)言中的重要結(jié)構(gòu)
- C語(yǔ)言中通過(guò)while 對(duì)代碼進(jìn)行循環(huán)執(zhí)行
- 可以對(duì)if while進(jìn)行剪裁和組合,實(shí)現(xiàn)更復(fù)雜的功能
- 循環(huán)體中需要有代碼改變循環(huán)條件,否則循環(huán)不會(huì)結(jié)束
- while語(yǔ)句之間可以相互嵌套,構(gòu)成多重循環(huán)
- while語(yǔ)句和if語(yǔ)句之間也可以相互嵌套
if 語(yǔ)句可以看作只循環(huán)一次的 while 語(yǔ)句
while語(yǔ)句可以看作擴(kuò)展的 if 語(yǔ)句
while(...)
if(...)
while(...)
{
}
四、do...while 與 for
do...while 循環(huán)結(jié)構(gòu)
do...while 的構(gòu)成與執(zhí)行
- do 是循環(huán)的開(kāi)始,while 是循環(huán)的結(jié)束
- do..while 可以看做一條語(yǔ)句,需要以分號(hào)結(jié)束
- do...while 是否繼續(xù)循環(huán)依賴于括號(hào)中的循環(huán)條件
- do...while 至少執(zhí)行一次循環(huán)體
上代碼:
#include <stdio.h> int main() { int sum = 0; int input = 0; int i = 0; while( i > 100 ) printf("while( i > 0 )\n"); do printf("do...while( i > 0 )\n"); while( i > 100 ); do { printf("Input: "); scanf("%d", &input); sum = sum + input; } while( sum < 100 ); printf("sum = %d\n", sum); return 0; }
下面為輸出結(jié)果:
這里注意一個(gè)問(wèn)題:while 和 do...while 的區(qū)別,可以看到 i 為 0 時(shí),while 循環(huán)里面的不會(huì)執(zhí)行,而 do...while 會(huì)執(zhí)行一次。
循環(huán)結(jié)構(gòu)的套路
- 初始化循環(huán)變量
- 在循環(huán)體中改變循環(huán)變量
- 判斷循環(huán)條件是否為真
真:執(zhí)行循環(huán)體
假:結(jié)束循環(huán)
for循環(huán)結(jié)構(gòu)(更簡(jiǎn)潔的循環(huán)結(jié)構(gòu))
for ( 0.初始化循環(huán)變量; 1.循環(huán)條件; 3.改變循環(huán)變量 )
{
2.循環(huán)體;
}
可以用下面的圖表示:
上代碼:
#include <stdio.h> int main() { int esum = 0; int osum = 0; int i = 0; for(i=1; i<=100; i=i+2) { osum = osum + i; esum = esum + (i + 1); } printf("osum = %d\n", osum); printf("esum = %d\n", esum); return 0; }
下面為輸出結(jié)果:
for循環(huán)注意事項(xiàng)
- for循環(huán)的各個(gè)部分(0,1,2,3)都是可選的
- 花括號(hào)可省略,省略花括號(hào)則循環(huán)體僅為一條語(yǔ)句
- for( ...; ...; ... )其中的分號(hào)不可省略
for ( 0.初始化循環(huán)變量; 1.循環(huán)條件; 3.改變循環(huán)變量 )
{
2.循環(huán)體;
}
上代碼:
#include <stdio.h> int main() { int sum = 0; int i = 1; for(; i <= 100; ) { sum = sum + i; i = i + 1; } printf("sum = %d\n", sum); return 0; }
下面為輸出結(jié)果:
小結(jié)
- do...while是至少執(zhí)行一次循環(huán)體的循環(huán)結(jié)構(gòu)
- do...while 先執(zhí)行循環(huán)體再判斷循環(huán)條件
- for是 while的進(jìn)化,在寫法上更加精簡(jiǎn)
- for 與 while 相同,先判斷循環(huán)條件再執(zhí)行循環(huán)體
五、break和continue
再論break
- break 能夠強(qiáng)制結(jié)束當(dāng)前結(jié)構(gòu),阻止程序向下執(zhí)行
- switch分支選擇結(jié)構(gòu), break立即結(jié)束switch
- 循環(huán)結(jié)構(gòu),break立即結(jié)束循環(huán)(忽略循環(huán)條件的真假)
上代碼:
#include <stdio.h> int main() { int sum = 0; int i = 1; while( 1 ) { sum = sum + i; if( i == 100 ) break; i = i + 1; } printf("sum = %d\n", sum); printf("i = %d\n", i); return 0; }
下面為輸出結(jié)果:
再上一段代碼:
#include <stdio.h> int main() { int target = 30; int input = 0; for(;;) { printf("Input: "); scanf("%d", &input); if( input == target ) break; else if( input < target ) printf("It's small!\n"); else if( input > target ) printf("It's big!\n"); } printf("Target = %d\n", input); return 0; }
下面為輸出結(jié)果:
break遵循最近匹配原則
- break 總是與離它最近的對(duì)應(yīng)關(guān)鍵字匹配
- 關(guān)鍵詞指的是在C語(yǔ)言中有特殊含義的單詞,如:while,for,switch等。
- 注:C語(yǔ)言中的變量名不能是關(guān)鍵字
上代碼:
#include <stdio.h> int main() { int i = 0; for(i=1; i<=10; i=i+1) { switch( i % 2 ) { case 0: printf("%d is even number!\n", i); break; case 1: printf("%d is odd number!\n", i); break; } } return 0; }
下面為輸出結(jié)果:
可以看到,break 對(duì)應(yīng)的是 switch ,而不是 for,這就是 break 的最近匹配原則。
再上一段代碼:
#include <stdio.h> int main() { int k = 0; int input = 0; printf("Input: "); scanf("%d", &input); switch( input % 2 ) { case 0: printf("case 0\n"); for(k=0; k<=2; k=k+1) if( k ) break; break; case 1: printf("case 1\n"); break; } return 0; }
下面為輸出結(jié)果:
如果把case 0 下面的 break 去掉一個(gè),那么輸出結(jié)果就會(huì)變成下面這樣:
這還是因?yàn)?break 的最近匹配原則,去掉一個(gè) break 后,break匹配的就是 for 了,所以也會(huì)輸出第二個(gè) case 后面的內(nèi)容。
continue一循環(huán)體終結(jié)者
- continue 是C語(yǔ)言中的關(guān)鍵字之一
- continue 立即結(jié)束當(dāng)前循環(huán)體,直接進(jìn)入下一輪條件判斷
- continue 與 break 不同,并不會(huì)結(jié)束整個(gè)循環(huán)
上代碼,打印1000以內(nèi)能被7整除的整數(shù),并統(tǒng)計(jì)數(shù)量:
#include <stdio.h> int main() { int i = 0; int n = 0; for(i=1; i<1000; i=i+1) { if( i % 7 ) continue; printf("%d ", i); n = n + 1; } printf("\n"); printf("Count: %d\n", n); return 0; }
下面為輸出結(jié)果:
小結(jié)
- break 忽略循環(huán)條件的真假,立即結(jié)束循環(huán)
- break 總是與離它最近的對(duì)應(yīng)關(guān)鍵字匹配
- continue 結(jié)束當(dāng)前循環(huán)體,直接進(jìn)入下一輪條件判斷
- continue 結(jié)束循環(huán)體的單次執(zhí)行,并不會(huì)結(jié)束整個(gè)循環(huán)
到此這篇關(guān)于C語(yǔ)言簡(jiǎn)明分析選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的使用的文章就介紹到這了,更多相關(guān)C語(yǔ)言選擇與循環(huán)結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VS2017開(kāi)發(fā)C語(yǔ)言出現(xiàn)“no_init_all“的解決辦法
這篇文章介紹了VS2017開(kāi)發(fā)C語(yǔ)言出現(xiàn)“no_init_all“的解決辦法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12C++圖像加載之libpng、FreeImage、stb_image詳解
libpng、FreeImage、stb_image都是圖像解析的開(kāi)源庫(kù),這篇文章主要為大家詳細(xì)介紹了這三者的使用方法,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-06-06C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的相互實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言相互實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-07-07