前言:C語言是由順序結構、選擇結構、循環結構組成的結構化的程序設計語言。?那C語言是如何設計和實現這些結構的呢?話不多說,馬上開始。
三種結構如圖所示:
我們可以使用?if else語句、 switch語句 來實現選擇(分支)結構,使用for 、 while 、 do while 來實現循環結構。
ps:本篇將先總結分支結構的知識,循環結構留到(下)篇。
看完覺得有幫助的話記得點贊收藏加關注哦~
目錄
一、關系、條件、邏輯操作符
?二、if else 語句
三、switch語句
四、分支結構小練習:判斷閏年
首先補充分支與循環必備操作符
一、關系、條件、邏輯操作符
(1)關系操作符:
C語??于?較的表達式,稱為“關系表達式”,??使?的運算符就稱為“關系運算符”,主要有下?6個。
>:?于運算符
<:?于運算符
>=:??于等于運算符
<=:?于等于運算符
==: 相等運算符
!=: 不相等運算符
用法:用于比較兩個值的大小或相等性,結果通常返回0或1,表示真假。
- eg:20<25是正確的,結果返回1;25<20是錯誤的,結果返回0。
(2)條件操作符:
條件操作符需要接受三個參數,因此又叫三目操作符。形式如下(exp是表達式expression的縮寫):
?exp1 ? exp2 : exp3
用法:如果exp1為真, exp2計算,計算的結果是整個表達式的結果;如果exp1為假, exp3計算,計算的結果是整個表達式的結果。
- eg:1<2?1:0 exp1是1<2,結果為真,計算exp2,結果是本身。因此這個表達式最終的結果就是exp2的結果1。
(3)邏輯運算符
提供邏輯判斷功能,?于構建更復雜的表達式,主要有下?三個運算符。
! :邏輯取反運算符(改變單個表達式的真假)。
&& :與運算符,就是并且的意思(兩側的表達式都為真,則為真,否則為假)。
|| :或運算符,就是或者的意思(兩側?少有?個表達式為真,則為真,否則為假)。
- eg:!0為非零表示真,1&&0為假,1||0為真。
?二、if else 語句
(1)結構:
if(表達式)語句1;
else語句2;
?執行流程:
- step1:判斷if中表達式的真假。
- step2:表達式為真?執行if中的語句1,跳過else。
- step3:表達式為假?跳過if,直接執行else中的語句2。
tips:上面的結構僅適用于單語句的情況,因為if和else只能控制一條語句,當分支中包含多條語句時要用大括號{}將多條語句括起來形成代碼塊
if(表達式) {語句1;語句3; } else {語句3;語句4; }
?先看一個問題:輸??個分數,>=60分就輸出:及格,<=60分就輸出:不及格。
下面三種寫法都可以解決這個問題
int score=0; scanf("%d",&score);//輸入一個成績①if(score>=60)printf("及格");elseprintf("不及格");②if(score>=60)printf("及格");if(score<=60)printf("不及格");③if(score>=60)printf("及格");else if(score<=60)//嵌套ifprintf("不及格");
(2)嵌套if(else if)
在 if else 語句中, else 可以與另?個 if 語句連?,構成多重判斷。
#include <stdio.h>
int main()
{int num = 0;scanf("%d", &num);if(num > 0)printf("輸?的數字是正數\n");else if(num < 0) printf("輸?的數字是負數\n");//這?的if 相當于嵌套在else語句中,形成了嵌套結構elseprintf("輸?的數字是0\n");return 0;
}
(3)懸空else問題
先看這樣一段代碼:
#include <stdio.h>
int main()
{int a = 0;int b = 2;if(a == 1)if(b == 2)printf("11\n");elseprintf("22\n");return 0;
}
大家覺得結果輸出什么呢??
小飛在初學階段看到這段代碼時本能的以為結果應該打印11,但實際上什么也不輸出。
為什么會這樣呢?這就是懸空else問題。分析如下:
在編寫代碼時,如果遇到多個if和else語句。需要注意一個規則:else總是與最接近的if匹配。有時候,代碼的排版可能會讓人產生誤解,比如上面的else與第一個if對齊,從而誤以為當第一個if條件不成立時,會執行else子句。但實際上,else是和第二個最近的if語句匹配,形成嵌套的if else語句。如果第一個if條件不成立,那么嵌套的if和else語句根本就沒有機會執行,因此最終可能什么都不會打印。
為了讓代碼更容易理解,我們應該調整代碼塊(添加大括號),使else與其真正匹配的if語句關系更加清晰。
#include <stdio.h> int main() {int a = 0;int b = 2;if(a == 1){if(b == 2)printf("11\n");}else{printf("22\n");}return 0; }
帶上適當的?括號形成代碼塊,代碼的邏輯就會更加的清晰,所以以后在寫代碼的時候要注意括號的使?,讓代碼的可讀性更?。
三、switch語句
除了 if 語句外,C語?還提供了 switch 語句來實現分?結構。switch語句可以看作是?種特殊形式的if else語句,?于判斷條件有多個結果的情況。它把多重的 else if 改成更易?、可讀性更好的形式。
(1)結構:
switch (表達式)
{case value1:語句1;case value2: 語句2;default: 語句3;
}
上?結構中,根據表達式不同的值,執?相應的 case 分?。如果找不到對應的值,就執? default 分?。
注意:
- switch 后的(表達式)必須是整型表達式(可以是數值,也可以是表達式,如a+b,a,b均是變量)。
- case 后的value值,必須是整形常量表達式(只能是數值,如1、2)。
- case 和后邊的數字之間必須有空格。
(2)break和default
①break
每?個 case 語句中的代碼執?完成后,需要加上 break ,才能跳出這個switch語句。
eg:
寫一個輸入?個1~7的數字,打印對應的星期?的程序:
#include <stdio.h> int main() {int day = 0;scanf("%d", &day);switch (day){case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期日\n");break;}return 0; }
當然, break 也不是每個 case 語句都得有,這就得根據實際情況來看了。?
比如當判斷星期幾是工作日還是休息日時,我們可以只在星期五和星期日時寫break,這樣在遇到星期1~5時因為沒有break 語句,代碼會繼續往下執?直到最后一個滿足工作日的星期跳出。
#include <stdio.h> int main() {int day = 0;scanf("%d", &day);switch(day){case 1:case 2:case 3:case 4:case 5:printf("?作?\n");break;case 6:case 7:printf("休息?\n");break;}return 0; }
②default
在使? switch 語句的時候,我們經常可能遇到?種情況,?如 switch 后的表達式中的值?法匹配代碼中的 case 語句的時候,這時候要不就不做處理,要不就得在 switch 語句中加?default ?句。switch 后邊的表達式結果不是 value1 ,也不是 value2 的時候,就會執?default ?句。
就?如上面打印星期的練習,如果 day 的輸?不是1~7的值,如果我們要提?:輸?錯誤,即可:
switch(day){case 1:case 2:case 3:case 4:case 5:printf("?作?\n");break;case 6:case 7:printf("休息?\n");break;default://輸入無匹配printf("輸?錯誤\n");break;}
tips:switch語句中的case和default無順序要求,只要順序是滿?實際需求的就可以。不過習慣把?default ?句放在最后處理。
四、分支結構小練習:判斷閏年
輸??個年份year,判斷year是否是閏年?
閏年判斷的規則:
①能被4整除并且不能被100整除是閏年,即滿足year%4==0 && year%100!=0
②能被400整除是閏年,即滿足year%400==0
參考代碼:
#include <stdio.h>
int main()
{int year = 0;scanf("%d", &year);if(year%4==0 && year%100!=0)printf("是閏年\n");else if(year%400==0)printf("是閏年\n");return 0;
}
?結語:非常感謝耐心看到這里的小伙伴,本文主要講了分支與循環中的分支結構,它們是代碼中的重要組成成分,是構建任何復雜結構的基石。下期主要圍繞循環結構展開。本篇文章到此結束,我們下期再見!
如果上述內容對您有幫助的話,還請點贊收藏?
如果發現內容有誤,還請給予指正,十分感謝:>