分支語句和循環語句(1)

?這篇文章我們詳細的把分支語句和循環語句給大家進行講解。

分支語句:
? if
? switch
循環語句:
? while
? for
? do while
goto語句:
?

1.什么是語句?

C語句可分為以下五類:
1. 表達式語句
2. 函數調用語句
3. 控制語句
4. 復合語句
5. 空語句

大家可以看一下這三個語句。

#define _CRT_SECURE_NO_WARNINGS 1
int main()
{3 + 5;//表達式語句printf("hehe\n");//函數調用語句;//空語句 - 有時候我們需要一條語句,但是這條語句什么都不需要做,就可以使用空語句return 0;
}


我們詳細的講解控制語句,控制語句用于控制程序的執行流程,以實現程序的各種結構方式,它們由特定的語句定義符組成,C語言有九種控制語句。
可分成以下三類:
1. 條件判斷語句也叫分支語句:if語句、switch語句;
2. 循環執行語句:do while語句、while語句、for語句;
3. 轉向語句:break語句、goto語句、continue語句、return語句。

2.分支語句(選擇結構)

如果你好好學習,校招時拿一個好offer,走上人生巔峰。
如果你不學習,畢業等于失業,回家賣紅薯。
這就是選擇!



2.1 if語句

if語句有多分支也有單分支,哪一條語句為真就進去哪一條語句,都為假則進入else語句。

語法結構:
if(表達式)
語句;
if(表達式)
語句1;
else
語句2;
//多分支
if(表達式1)
語句1;
else if(表達式2)
語句2;
else
語句3;

這是單分支:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{//如果年齡大于等于18-成年人int age = 0;scanf("%d", &age);if (age >= 18)printf("成年人\n");return 0;
}

?這是多分支:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{//如果年齡大于等于18-成年人,否則打印-未成年人int age = 0;scanf("%d", &age);if (age >= 18)printf("成年人\n");elseprintf("未成年人\n");return 0;
}

?實例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int age = 0;scanf("%d", &age);if (age < 18){printf("未成年\n");}else if (age >= 18 && age <= 30){printf("青年\n");}else if (age >= 31 && age <= 50){printf("中年\n");}else if (age >= 51 && age <= 70){printf("中老年\n");}else if (age >= 71 && age <= 99){printf("老年\n");}else{printf("老壽星\n");}return 0;
}

我們也可以把&&前的表達式去掉,因為走到這一條語句的時候,上一條語句的表達式一定是假的。大家注意一下,if語句后面默認執行一條表達式

如果條件成立,要執行多條語句,怎應該使用代碼塊。

#include <stdio.h>
int main()
{
if(表達式)
{
語句列表1;
}
else
{
語句列表2;
}
return 0;

這里的一對 { } 就是一個代碼塊。

2.1.1懸空else

#include <stdio.h>
int main()
{int a = 0;int b = 2;if(a == 1)if(b == 2)printf("hehe\n");elseprintf("haha\n");
return 0;
}

這就是懸空else,這是一種不好的代碼習慣。

改正:

//適當的使用{}可以使代碼的邏輯更加清楚。
//代碼風格很重要
#include <stdio.h>
int main()
{int a = 0;int b = 2;if(a == 1){if(b == 2){printf("hehe\n");}}else{printf("haha\n");}
return 0;
}

?else的匹配:else是和它離的最近的if匹配的。

2.1.2 if書寫形式的對比

//代碼1
if (condition) {
return x;
}
return y;
//代碼2
if(condition)
{
return x;
}
else
{
return y;
}
//代碼3
int num = 1;
if(num == 5)
{
printf("hehe\n");
}
//代碼4
int num = 1;
if(5 == num)
{
printf("hehe\n");
}

代碼2和代碼4更好,邏輯更加清晰,不容易出錯。

2.1.3 練習

1. 判斷一個數是否為奇數

輸入一個整數,如果這個整數%2等于1,就打印YES,這個數就是奇數,否則就不是。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int n = 0;scanf("%d", &n);if (n % 2 == 1)printf("YES\n");elseprintf("NO\n");return 0;
}

?

2. 輸出1-100之間的奇數

設置循環條件<=100,即遍歷1-100的整數,打印出來,每打印一次,i+=2,即相鄰的奇數。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int i = 1;while (i <= 100){printf("%d ", i);i = i + 2;//i+=2;}return 0;
}

?2.2 switch語句

switch語句也是一種分支語句。
常常用于多分支的情況。
比如:
輸入1,輸出星期一
輸入2,輸出星期二
輸入3,輸出星期三
輸入4,輸出星期四
輸入5,輸出星期五
輸入6,輸出星期六
輸入7,輸出星期日
那我沒寫成 if...else if ...else if 的形式太復雜,那我們就得有不一樣的語法形式。
這就是switch 語句。

switch(整型表達式)
{
語句項;
}

而語句項是什么呢?

//是一些case語句:
//如下:
case 整形常量表達式:
語句;

2.2.1 在switch語句中的 break

在switch語句中,我們沒辦法直接實現分支,搭配break使用才能實現真正的分支。
比如:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int day = 0;scanf("%d", &day);//4switch (day){case 1:printf("星期1\n");break;case 2:printf("星期2\n");break;case 3:printf("星期3\n");break;case 4:printf("星期4\n");break;case 5:printf("星期5\n");break;case 6:printf("星期6\n");break;case 7:printf("星期天\n");break;}return 0;
}

break實現了switch語句中跳出分支的效果,如果我們不用break,那么上面代碼會從case1持續進行到case7。

有時候我們的需求變了:
1. 輸入1-5,輸出的是“weekday”;
2. 輸入6-7,輸出“weekend”

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("weekday\n");break;case 6:case 7:printf("weekend\n");break;}return 0;
}

break語句 的實際效果是把語句列表劃分為不同的分支部分。

編程好習慣

在最后一個 case 語句的后面加上一條 break語句。

(之所以這么寫是可以避免出現在以前的最后一個 case 語句后面忘了添加 break語句)。

2.2.2 default子句

如果表達的值與所有的case標簽的值都不匹配怎么辦?
其實也沒什么,結構就是所有的語句都被跳過而已。
程序并不會終止,也不會報錯,因為這種情況在C中并不認為是個錯誤。
但是,如果你并不想忽略不匹配所有標簽的表達式的值時該怎么辦呢?
你可以在語句列表中增加一條default子句,把下面的標簽
default:
寫在任何一個 case 標簽可以出現的位置。
當 switch 表達式的值并不匹配所有 case 標簽的值時,這個 default 子句后面的語句就會執行。
所以,每個switch語句中只能出現一條default子句。
但是它可以出現在語句列表的任何位置,而且語句流會像執行一個case標簽一樣執行default子句。
編程好習慣

在每個 switch 語句中都放一條default子句是個好習慣,甚至可以在后邊再加一個 break 。

比如:?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int day = 0;scanf("%d", &day);//4switch (day){case 1:printf("星期1\n");break;case 2:printf("星期2\n");break;case 3:printf("星期3\n");break;case 4:printf("星期4\n");break;case 5:printf("星期5\n");break;case 6:printf("星期6\n");break;case 7:printf("星期天\n");break;default:printf("輸入錯誤,請重新輸入"\n);break;}return 0;
}

2.2.3 練習

大家覺得這段代碼的結果是什么呢?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int n = 1;int m = 2;switch (n){case 1:m++;case 2:n++;case 3:switch (n){//switch允許嵌套使用case 1:n++;case 2:m++;n++;break;}case 4:m++;break;default:break;}printf("m = %d, n = %d\n", m, n);return 0;
}

答案是:


?

為什么呢?因為沒遇到break之前程序會一直運行,所以在跳出switch(n)后還會進入case4,再結束運行。?


?3.循環語句

while
for
do while

3.1 while循環

我們已經掌握了,if語句:

if(條件)
語句;

當條件滿足的情況下,if語句后的語句執行,否則不執行。
但是這個語句只會執行一次。
由于我們發現生活中很多的實際的例子是:同一件事情我們需要完成很多次。
那我們怎么做呢?
C語言中給我們引入了: while 語句,可以實現循環。

//while 語法結構
while(表達式)
循環語句;

while語句執行的流程:

?大家看看這兩段代碼的區別:

int main()
{if (1)printf("hehe\n");return 0;
}int main()
{while (1)printf("hehe\n");return 0;
}

if語句只會執行一次,而while的會一直執行,重復做同一件事。

比如我們實現:
在屏幕上打印1-10的數字。

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

上面的代碼已經幫我了解了 while 語句的基本語法,那我們再了解一下:

3.1.1 while語句中的break和continue

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

這里代碼輸出的結果是什么?

?總結:
break在while循環中的作用:
其實在循環中只要遇到break,就停止后期的所有的循環,直接終止循環。
所以:while中的break是用于永久終止循環的。

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

?

?

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

?大家有沒有發現區別呢?其實continue的作用已經很明顯了。

總結:
continue在while循環中的作用就是:
continue是用于終止本次循環的,也就是本次循環中continue后邊的代碼不會再執行,
而是直接跳轉到while語句的判斷部分。進行下一次循環的入口判斷

?3.2 for循環

我們已經知道了while循環,但是我們為什么還要一個for循環呢?
首先來看看for循環的語法:

3.2.1 語法

for(表達式1; 表達式2; 表達式3)
循環語句;

表達式1
表達式1為初始化部分,用于初始化循環變量的。
表達式2
表達式2為條件判斷部分,用于判斷循環時候終止。
表達式3
表達式3為調整部分,用于循環條件的調整。

實際的問題:
使用for循環 在屏幕上打印1-10的數字:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int i = 0;//for(i=1/*初始化*/; i<=10/*判斷部分*/; i++/*調整部分*/)for (i = 1; i <= 10; i++){printf("%d ", i);}return 0;
}

for循環的執行流程圖:

現在我們對比一下for循環和while循環:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int i = 0;
//實現相同的功能,使用while
i = 1;//初始化部分
while (i <= 10)//判斷部分
{printf("hehe\n");i = i + 1;//調整部分
}
//實現相同的功能,使用for
for (i = 1; i <= 10; i++)
{printf("hehe\n");
}

可以發現在while循環中依然存在循環的三個必須條件,但是由于風格的問題使得三個部分很可能偏離較遠,這樣查找修改就不夠集中和方便。

所以,for循環的風格更勝一籌;for循環使用的頻率也最高。

3.2.2 break和continue在for循環中

我們發現在for循環中也可以出現break和continue,他們的意義和在while循環中是一樣的。
但是還是有些差異:

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

?

?

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

?

?continue在while循環中跳過本次循環后面的代碼,有可能會跳過調整部分,但是在for循環中不會,因為continue只會跳過后面的部分再來到調整部分,這就是兩者的區別,也是for循環的優勢。

在for循環中,如果遇到continue,會跳過continue后邊的代碼,直接去循環的調整部分

break在for循環中也是直接終止循環,只要遇到break,循環就直接結束。

3.2.3 for語句的循環控制變量

建議:

1. 不可在for 循環體內修改循環變量,防止 for 循環失去控制。
2. 建議for語句的循環控制變量的取值采用“前閉后開區間”寫法。

int i = 0;
//前閉后開的寫法
for(i=0; i<10; i++)
{}
//兩邊都是閉區間
for(i=0; i<=9; i++)
{}

3.2.4 一些for循環的變種

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{//代碼1for (;;){printf("hehe\n");}//for循環中的初始化部分,判斷部分,調整部分是可以省略的,但是不建議初學時省略,容易導致問題。
return 0;
}

?這是一個雙層循環,一共打印了9次。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int i = 0;int j = 0;//這里打印多少個hehe?for (i = 0; i < 3; i++){for (j = 0; j < 3; j++){printf("hehe\n");}}return 0;
}

?i=0時,第二個for循環打印了3次,i++,再進去第一個for循環,i<3,再進去第二個循環的時候j是3,直接退出循環,所以說不要隨意省略初始化部分。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int i = 0;int j = 0;//如果省略掉初始化部分,這里打印多少個hehe?for (; i < 3; i++){for (; j < 3; j++){printf("hehe\n");}}return 0;
}

?使用多余一個變量控制循環::

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int x, y;for (x = 0, y = 0; x < 2 && y < 5; ++x, y++){printf("hehe\n");}return 0;
}

3.2.5 一道筆試題:

請問循環要循環多少次?

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int i = 0;int k = 0;for (i = 0, k = 0; k = 0; i++, k++)k++;return 0;
}

大家注意k=0是判斷部分,=是賦值符號,c語言判斷0為假,非0為真,所以一次都不會循環。


今天的分享到這里就結束啦!感謝烙鐵們的閱讀,讓我們下一篇文章再見,下一篇文章會有個小游戲-猜數字游戲,非常詳細哦。
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35495.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

qt自己實現方便的線程管理類

看本博客之前&#xff0c;可以先看看我這篇多線程博客&#xff1a;qt多線程使用方式_我是標同學的博客-CSDN博客

ORCA優化器淺析——CDXLOperator Base class for operators in a DXL tree

如上圖所示&#xff0c;CDXLOperator作為Base class for operators in a DXL tree&#xff0c;其子類CDXLLogical、CDXLScalar、CDXLPhysical作為邏輯節點、物理節點和Scalar節點的DXL表示類&#xff0c;因此其包含了這些類的共同部分特性&#xff0c;比如獲取其DXL節點表示的函…

Qt 文件對話框使用 Deepin風格

當你在Deepin或UOS 上開發 Qt 程序時&#xff0c;如果涉及到文件對話框功能&#xff0c;那么就會遇到調用原生窗口的問題。 如果你使用的是官方的Qt版本&#xff0c;那么在Deepin或者UOS系統上&#xff0c;彈出的文件對話框會是如下這樣&#xff1a; 而Deepin或UOS系統提供的默…

可視化高級繪圖技巧100篇-總論

前言 優秀的數據可視化作品可以用三個關鍵詞概括&#xff1a;準確、清晰、優雅。 準確&#xff1a;精準地反饋數據的特征信息&#xff08;既不遺漏也不冗余&#xff0c;不造成讀者疏漏&誤讀細節&#xff09; 清晰&#xff1a;獲取圖表特征信息的時間越短越好 優雅&…

Gitlab CI/CD筆記-第二天-主機套接字進行構建并push鏡像。

一、安裝gitlab-runner 1.可以是linux也可以是docker的 2.本文說的是docker安裝部署的。 二、直接上.gitlab-ci.yml stages: # List of stages for jobs, and their order of execution - build-image build-image-job: stage: build-image image: harbor.com:543/docke…

企業計算機服務器中了360后綴勒索病毒怎么辦,勒索病毒解密數據恢復

隨著計算機技術的不斷發展&#xff0c;企業的辦公系統得到了很大提升&#xff0c;但是隨之而來的網絡安全威脅也不斷增加&#xff0c;勒索病毒的攻擊事件時有發生。近期&#xff0c;我們收到某地連鎖超市的求助&#xff0c;企業的計算機服務器遭到了360后綴勒索病毒攻擊&#x…

C#四個字節十六進制與單精度浮點數互轉

C#四個字節十六進制與單精度浮點數互轉可以使用自帶的函數,也可以自己寫 實例如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace floatDemo {class Program{//首先設置:項目->屬性…

html練習

html練習 工具代碼運行結果 工具 HBuilder X 代碼 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>圖靈之家</title></head><body><h1>圖靈之家</h1><br><br><h2>我的…

Maxwell 數據同步使用教程

Maxwell 數據同步使用教程 Maxwell 是一個開源的 MySQL 數據同步工具&#xff0c;它可以提供可靠的、實時的數據復制服務。它的特點是將 MySQL 的 binlog 解析成易于理解、易于使用的 JSON 格式&#xff0c;并將其發送到 Kafka 或其他消息隊列&#xff0c;方便消費者進行數據處…

使用幾何和線性代數從單個圖像進行 3D 重建

使用幾何和線性代數從單個圖像進行 3D 重建 薩蒂亞 一、說明 3D重構是一個挑戰性題目&#xff0c;而且這個新穎的題目正處于啟發和膨脹階段&#xff1b;因此&#xff0c;各種各樣的嘗試層出不窮&#xff0c;本篇說明嘗試的一種&#xff0c;至于其它更多的嘗試&#xff0c;我們在…

nlohmann json:通過at讀取及設置object和array

讀取及設置: #include <iostream> #include <nlohmann/json.hpp> using namespace std; using json = nlohmann::json;int main() {json data = R"({"name": "xiaoming","age": 10, "parent": [{"father&qu…

RTT(RT-Thread)IO設備模型

目錄 IO設備模型 模型框架原理 IO設備類型 創建和注冊IO設備 RTT設備管理程序實現原理 訪問IO設備 查找設備 初始化設備 打開設備 關閉設備 控制設備 讀寫設備 數據收發回調 數據接收回調 數據發送回調 設備模型實例 IO設備模型 RT-Thread 提供了一套簡單的 I/O …

網絡編程(TFTP協議實驗)

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <head.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h>#define PORT 69 //端口號&#xf…

網絡安全威脅與防御策略

第一章&#xff1a;引言 隨著數字化時代的快速發展&#xff0c;網絡已經成為人們生活和工作中不可或缺的一部分。然而&#xff0c;網絡的廣泛應用也引發了一系列嚴峻的網絡安全威脅。惡意軟件、網絡攻擊、數據泄露等問題層出不窮&#xff0c;給個人和企業帶來了巨大的風險。本文…

mysql基礎之觸發器的簡單使用

1.建立學生信息表 -- 觸發器 -- 建立學生信息表 create table s1(id int unsigned auto_increment,name varchar(30),score tinyint unsigned,dept varchar(50),primary key(id) );2.建立學生補考信息表 -- 建立學生補考信息表 create table s2 like s1;3.建立觸發器&#xf…

java 自定義xss校驗注解實現

自定義一個注解Xss。名字隨意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

深入理解與運用Android Jetpack ViewModel

在Android開發中&#xff0c;數據與界面的分離一直是一項重要的挑戰。為了解決這個問題&#xff0c;Google推出了Android Jetpack組件之一的ViewModel。ViewModel是一種用于管理UI相關數據的架構組件&#xff0c;它能夠幫助開發者實現優雅的數據驅動和生命周期管理。本文將深入…

C字符串練習題(6.3.1)

編寫一個程序&#xff0c;從鍵盤上讀入一個小于1000的正整數&#xff0c;然后創建并輸出一個字符串&#xff0c;說明該整數的值。例如&#xff0c;輸入941&#xff0c;程序產生的字符串是“Nine hundred and forty one”。 #include<stdlib.h> #include<string.h>…

前端HTML入門基礎

階段目標&#xff1a;掌握HTML、CSS常用布局技巧&#xff0c;能夠獨立制作網頁。 day01&#xff1a;HTML 基礎 目標&#xff1a;掌握標簽基本語法&#xff0c;能夠獨立布局文章頁。 01-今日課程介紹 今日目標&#xff1a;掌握標簽基本語法&#xff0c;能夠獨立布局文章頁。 核心…

SQL中CONVERT函數格式:CONVERT(data_type,expression[,style])

sqlserver convert()函數的使用方法_convert sqlserver_qq_37528515的博客-CSDN博客 SQL中CONVERT函數格式:CONVERT(data_type,expression[,style]) 說明&#xff1a; data_type:目標系統所提供的數據類型&#xff0c;如果轉換時沒有指定數據類型的長度&#xff0c;則 SQL Serv…