?
目錄
?一. 分支結構:if 語句與 switch 語句
1. if 語句
2. switch 語句?
二、關系操作符、條件操作符與邏輯操作符?
1. 關系操作符
2. 條件操作符
3. 邏輯操作符
三、循環結構:while 循環、for 循環與 do - while 循環?
1. while 循環
2. for 循環
3. do - while 循環
四、break 和 continue 語句:循環控制的利器
(一)break 語句
(二)continue 語句
五、循環的嵌套與 goto 語句
(一)循環的嵌套
(二)goto 語句
? ? 在 C 語言的世界里,分支和循環結構編程的核心內容,它們賦予了程序根據不同條件執行不同操作以及重復執行特定代碼段的能力,讓程序變得更加智能和高效。今天,我們就深入探討 C 語言分支和循環的相關知識,助力大家夯實編程基礎。
?一. 分支結構:if 語句與 switch 語句
1. if 語句
? ? 1.1 基本形式與原理:
? ? if 語句是 C 語言中最常用的分支結構之一。其基本語法為
if (表達式) 語句
,當表達式的值為非 0(在 C 語言中,非 0 表示真)時,執行后面的語句;若表達式的值為 0(表示假),則語句不執行 。例如,在判斷一個整數是否為奇數的代碼中:int main() {int num = 0;scanf("%d", &num);if(num % 2 == 1)printf("%d是奇數\n", num);return 0; }
? ? 這里通過
num % 2 == 1
這個表達式來判斷num
是否為奇數,若滿足條件則打印相應信息。
? ? 1.2?if...else... 結構:
? ? 為了更全面地進行條件判斷,
if...else...
結構應運而生。語法為if (表達式) 語句1 else 語句2
,當表達式為真時執行語句1
,否則執行語句2
。以判斷整數是奇數還是偶數為例:?int main() {int num = 0;scanf("%d", &num);if(num % 2 == 1)printf("%d是奇數\n", num);elseprintf("%d是偶數\n", num);return 0; }
?1.3 控制多條語句:
? ? 默認情況下,
if
和else
語句只控制一條語句。若要控制多條語句,需使用大括號{}
將代碼括起來,形成程序塊或復合語句。例如:int main() {int age = 0;scanf("%d", &age);if(age >= 18) {printf("成年了\n");printf("可以談戀愛了\n");}else {printf("未成年\n");printf("不可以早戀哦\n");}return 0; }
1.4 嵌套if語句:
在
if else
語句中,else
可以與另一個if
語句連用,構成嵌套 if 語句,實現更復雜的邏輯判斷。比如判斷一個整數是 0、正數還是負數:int main() {int num = 0;scanf("%d", &num);if(num == 0)printf("輸入的數字是0\n");else if(num > 0) printf("輸入的數字是正數\n");elseprintf("輸入的數字是負數\n");return 0; }
1.5 懸空 else 問題:
? ? 當存在多個
if
和else
時,else
總是與最接近的if
匹配。例如:int main() {int a = 0;int b = 2;if(a == 1)if(b == 2)printf("hehe\n");elseprintf("haha\n");return 0; }
? ? 這段代碼中,
else
實際上與第二個if
匹配,若想讓else
與第一個if
匹配,需添加大括號,增強代碼可讀性
2. switch 語句?
2.1 基本形式和應用場景:
? switch
語句是另一種實現分支結構的方式,適用于判斷條件有多個結果的情況。其語法為:? ? ? ?
? switch (expression)
? {?
? ? case value1: statement;
? ? case value2: statement;
? ? default: statement;
? }
? ? 根據
expression
的值執行相應的case
分支,若找不到匹配值,則執行default
分支。例如,計算整數除 3 之后的余數:int main() {int n = 0;scanf("%d", &n);switch(n%3){case 0:printf("整除,余數為0\n");break;case 1:printf("余數是1\n");break;case 2:printf("余數是2\n");break;default :printf("沒有匹配的值");break;}return 0; }
? ? n%3的計算結果如果等于0 1 2就執行相應的語句,沒有相等的值就執行default后面的語句
2.2 break 的重要性:
? ? 在
switch
語句中,break
用于跳出switch
語句。若某case
語句后沒有break
,代碼會繼續執行后續case
語句,直到遇到break
或switch
語句結束。例如,去掉上述代碼中的break
,會出現不符合預期的結果。2.3 default 子句:
? ? 當
switch
后的表達式的值無法匹配代碼中的case
語句時,可使用default
子句進行處理。比如在打印星期的練習中,可用于提示輸入錯誤。2.4 case 和 default 的順序:
? switch
語句中case
子句和default
子句沒有嚴格的順序要求,但通常將default
子句放在最后。
二、關系操作符、條件操作符與邏輯操作符?
1. 關系操作符
? ? C 語言中的關系操作符包括
>
、<
、>=
、<=
、==
、!=
,用于比較兩個值的大小或是否相等,構成關系表達式。關系表達式的結果通常為 0(假)或 1(真) 。使用時需注意,相等運算符==
與賦值運算符=
不同,同時應避免多個關系運算符連用。例如,判斷年齡是否在 18 歲到 36 歲之間,正確的寫法是if(age>=18 && age<=36)
,而不是if(18<=age<=36)
。int main() {int age = 30;if(age>18){printf("長大了");}else{printf("小孩");}return 0; }
2. 條件操作符
? ? 條件操作符也叫三目操作符,形式為
exp1? exp2: exp3
。其計算邏輯是:若exp1
為真,計算exp2
,其結果為整個表達式的結果;若exp1
為假,計算exp3
,其結果為整個表達式的結果。int main() {int a = 3;int b = 4;int c = a > b ? 3 : 4;//如果a大于b給c賦值3,反之,賦值4printf("%d",c);return 0; }
3. 邏輯操作符
? ? 3.1 邏輯取反運算符
!
:? ? 用于改變單個表達式的真假。例如,若
flag
為假,執行特定操作:int main() {int flag = 0;if(!flag){printf("do something\n");}return 0; }
? ? 3.2?邏輯與運算符
&&
:? ? 表示并且的意思,只有當兩側表達式都為真時,整個表達式才為真。如判斷月份是否在 3 月到 5 月(春天):
if(month >= 3 && month <= 5)
。int main() {int month = 4;if(month >= 3 && month <= 5)//兩個條件同時滿足就執行下面的語句{printf("春天");}else{ ;}return 0; }
? ? 3.3 邏輯或運算符 ||:
? ? 表示或者的意思,只要兩側表達式至少有一個為真,整個表達式就為真。如判斷月份是否是 12 月、1 月或 2 月(冬天):
if(month == 12 || month==1 || month == 2)
。??
int main() {int month = 4;if(month == 3 || month == 5 || month== 4)//三個條件滿足一個就執行下面的語句{printf("春天");}else{ ;}return 0; }
? ? 3.4 短路現象:
? ? C 語言邏輯運算符具有短路特性,總是先對左側表達式求值,再對右側表達式求值。若左側表達式滿足邏輯運算符的條件,就不再對右側表達式求值。例如,在
if(month >= 3 && month <= 5)
中,當month >= 3
為假時,就不再判斷month <= 5
。
三、循環結構:while 循環、for 循環與 do - while 循環?
1. while 循環
? ? 語法與執行流程:
while
循環的語法為while(表達式) 語句
。執行時先判斷表達式的值,若為 0 則循環結束,若為非 0 則執行循環語句,之后再次判斷表達式,如此循環。? ?
? ? 實踐應用:例如,在屏幕上打印 1 到 10 的值:
int main() {int i = 1;while(i<=10){printf("%d ", i);i = i+1;}return 0; }
? ? 練習:輸入一個正整數,逆序打印其每一位。通過
n%10
獲取最低位,n=n/10
去掉最低位,利用while
循環實現int main() {int a = 1234;while (a){printf("%d ", a % 10);a = a / 10;}return 0; }
2. for 循環
?? ? 語法與執行流程:
for
循環的語法為for(表達式1; 表達式2; 表達式3) 語句
。其中,表達式1
用于循環變量的初始化,表達式2
用于循環結束條件的判斷,表達式3
用于循環變量的調整 。執行時先執行表達式1
,再判斷表達式2
,若為真則執行循環語句,之后執行表達式3
,然后再次判斷表達式2
,直到表達式2
為假時循環結束。? ? 實踐應用:同樣是在屏幕上打印 1 到 10 的值,
for
循環的代碼為:int main() {int i = 0;for(i=1; i<=10; i++){printf("%d ", i);}return 0; }
? ? 與 while 循環的對比:
for
循環和while
循環都有初始化、判斷、調整三個部分,但for
循環的這三個部分更集中,便于代碼維護,在形式上更具優勢? ??
? ? 練習:計算 1 到 100 之間 3 的倍數的數字之和,可通過優化循環直接產生 3 的倍數來提高效率。
int main() {int sum = 0;for (int i = 3; i <= 100; i = i + 3){sum = sum + i;}printf("%d ", sum);return 0; }
3. do - while 循環
? ? 語法與執行流程:
do - while
循環的語法為do 語句; while(表達式);
。它先執行循環體語句,再判斷表達式的值,若為真則繼續循環,若為假則結束循環。其特點是循環體至少執行一次。? ??
? ? 實踐應用:在屏幕上打印 1 到 10 的值,代碼如下:
int main() {int i = 1;do{printf("%d ", i);i = i + 1;}while(i<=10);return 0; }
練習:輸入一個正整數,計算其位數。使用
do - while
循環,因為即使輸入的數是 0,也可作為 1 位數統計int main() {int a = 0;int i = 0;scanf("%d", &a);do{a = a / 10;i++;} while (a);printf("%d", i);return 0; }
四、break 和 continue 語句:循環控制的利器
(一)break 語句
? ? break
用于永久終止循環,一旦執行,直接跳出所在循環,繼續執行循環后面的代碼。在while
、for
、do - while
循環中作用相同。例如,在while
循環中,當i
等于 5 時終止循環:int main() {int i = 1;while(i<=10){if(i == 5)break;printf("%d ", i);i = i+1;}return 0; }
(二)continue 語句
? continue
用于跳過本次循環中continue
后面的代碼,直接進入下一次循環的判斷。在while
循環和for
循環中表現略有不同,在while
循環中跳到循環判斷位置,而在for
循環中會跳到循環調整部分。
五、循環的嵌套與 goto 語句
(一)循環的嵌套
? ? 三種循環(
while
、do - while
、for
)可以相互嵌套,解決更復雜的問題。例如,找出 100 到 200 之間的素數,需要使用兩層循環,外層循環遍歷 100 到 200 的數字,內層循環判斷每個數字是否為素數。int main() {for (int i = 100; i <= 200; i++){int falg = 0;for (int j = 2; j < i - 1; j++){if (i % j == 0){falg = 1;break;}}if (falg == 0){printf("%d ", i);}}return 0; }
(二)goto 語句
? goto
語句可以實現在同一個函數內跳轉到設置好的標號處。雖然使用不當會打亂程序執行流程,但在多層循環中,若想快速跳出循環,goto
語句會更加便捷。int main() {printf("hehe\n");goto next;printf("haha\n");next:printf("跳過了haha的打印\n"); return 0; }
通過對 C 語言分支和循環知識的詳細介紹,相信大家對這些重要的編程概念有了更深入的理解。在實際編程中,靈活運用這些知識,能夠編寫出更高效、更復雜的程序。希望大家不斷練習,提升自己的編程技能!
練習:
?線段圖案_牛客題霸_牛客網