判斷結(jié)構(gòu)要求程序員指定一個(gè)或多個(gè)要評(píng)估或測(cè)試的條件,以及條件為真時(shí)要執(zhí)行的語(yǔ)句(必需的)和條件為假時(shí)要執(zhí)行的語(yǔ)句(可選的)。
C 語(yǔ)言把任何非零和非空的值假定為 true,把零或 null 假定為 false。
下面是大多數(shù)編程語(yǔ)言中典型的判斷結(jié)構(gòu)的一般形式:

判斷語(yǔ)句
C 語(yǔ)言提供了以下類型的判斷語(yǔ)句。點(diǎn)擊鏈接查看每個(gè)語(yǔ)句的細(xì)節(jié)。
| 語(yǔ)句 | 描述 |
|---|---|
| if 語(yǔ)句 | 一個(gè) if 語(yǔ)句 由一個(gè)布爾表達(dá)式后跟一個(gè)或多個(gè)語(yǔ)句組成。 |
| if...else 語(yǔ)句 | 一個(gè) if 語(yǔ)句 后可跟一個(gè)可選的 else 語(yǔ)句,else 語(yǔ)句在布爾表達(dá)式為假時(shí)執(zhí)行。 |
| 嵌套 if 語(yǔ)句 | 您可以在一個(gè) if 或 else if 語(yǔ)句內(nèi)使用另一個(gè) if 或 else if 語(yǔ)句。 |
| switch 語(yǔ)句 | 一個(gè) switch 語(yǔ)句允許測(cè)試一個(gè)變量等于多個(gè)值時(shí)的情況。 |
| 嵌套 switch 語(yǔ)句 | 您可以在一個(gè) switch 語(yǔ)句內(nèi)使用另一個(gè) switch 語(yǔ)句。 |
一個(gè) if 語(yǔ)句 由一個(gè)布爾表達(dá)式后跟一個(gè)或多個(gè)語(yǔ)句組成。
if語(yǔ)句
C 語(yǔ)言中 if 語(yǔ)句的語(yǔ)法:
if(boolean_expression)
{
/* 如果布爾表達(dá)式為真將執(zhí)行的語(yǔ)句 */
}
如果布爾表達(dá)式為 true,則 if 語(yǔ)句內(nèi)的代碼塊將被執(zhí)行。如果布爾表達(dá)式為 false,則 if 語(yǔ)句結(jié)束后的第一組代碼(閉括號(hào)后)將被執(zhí)行。
C 語(yǔ)言把任何非零和非空的值假定為 true,把零或 null 假定為 false。
流程圖

實(shí)例
#include <stdio.h>
int main ()
{
/* 局部變量定義 */
int a = 10;
/* 使用 if 語(yǔ)句檢查布爾條件 */
if( a < 20 )
{
/* 如果條件為真,則輸出下面的語(yǔ)句 */
printf("a 小于 20\n" );
}
printf("a 的值是 %d\n", a);
return 0;
}
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
a 小于 20
a 的值是 10
if...else 語(yǔ)句
一個(gè) if 語(yǔ)句 后可跟一個(gè)可選的 else 語(yǔ)句,else 語(yǔ)句在布爾表達(dá)式為 false 時(shí)執(zhí)行。
語(yǔ)法
C 語(yǔ)言中 if...else 語(yǔ)句的語(yǔ)法:
if(boolean_expression)
{
/* 如果布爾表達(dá)式為真將執(zhí)行的語(yǔ)句 */
}
else
{
/* 如果布爾表達(dá)式為假將執(zhí)行的語(yǔ)句 */
}
如果布爾表達(dá)式為 true,則執(zhí)行 if 塊內(nèi)的代碼。如果布爾表達(dá)式為 false,則執(zhí)行 else 塊內(nèi)的代碼。
C 語(yǔ)言把任何非零和非空的值假定為 true,把零或 null 假定為 false。
流程圖

實(shí)例
#include <stdio.h>
int main ()
{
/* 局部變量定義 */
int a = 100;
/* 檢查布爾條件 */
if( a < 20 )
{
/* 如果條件為真,則輸出下面的語(yǔ)句 */
printf("a 小于 20\n" );
}
else
{
/* 如果條件為假,則輸出下面的語(yǔ)句 */
printf("a 大于 20\n" );
}
printf("a 的值是 %d\n", a);
return 0;
}
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
a 大于 20
a 的值是 100
if...else if...else 語(yǔ)句
一個(gè) if 語(yǔ)句后可跟一個(gè)可選的 else if...else 語(yǔ)句,這可用于測(cè)試多種條件。
當(dāng)使用 if...else if...else 語(yǔ)句時(shí),以下幾點(diǎn)需要注意:
- 一個(gè) if 后可跟零個(gè)或一個(gè) else,else 必須在所有 else if 之后。
- 一個(gè) if 后可跟零個(gè)或多個(gè) else if,else if 必須在 else 之前。
- 一旦某個(gè) else if 匹配成功,其他的 else if 或 else 將不會(huì)被測(cè)試。
語(yǔ)法
C 語(yǔ)言中的 if...else if...else 語(yǔ)句的語(yǔ)法:
if(boolean_expression 1)
{
/* 當(dāng)布爾表達(dá)式 1 為真時(shí)執(zhí)行 */
}
else if( boolean_expression 2)
{
/* 當(dāng)布爾表達(dá)式 2 為真時(shí)執(zhí)行 */
}
else if( boolean_expression 3)
{
/* 當(dāng)布爾表達(dá)式 3 為真時(shí)執(zhí)行 */
}
else
{
/* 當(dāng)上面條件都不為真時(shí)執(zhí)行 */
}
實(shí)例
#include <stdio.h>
int main ()
{
/* 局部變量定義 */
int a = 100;
/* 檢查布爾條件 */
if( a == 10 )
{
/* 如果 if 條件為真,則輸出下面的語(yǔ)句 */
printf("a 的值是 10\n" );
}
else if( a == 20 )
{
/* 如果 else if 條件為真,則輸出下面的語(yǔ)句 */
printf("a 的值是 20\n" );
}
else if( a == 30 )
{
/* 如果 else if 條件為真,則輸出下面的語(yǔ)句 */
printf("a 的值是 30\n" );
}
else
{
/* 如果上面條件都不為真,則輸出下面的語(yǔ)句 */
printf("沒(méi)有匹配的值\n" );
}
printf("a 的準(zhǔn)確值是 %d\n", a );
return 0;
}
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
沒(méi)有匹配的值
a 的準(zhǔn)確值是 100
嵌套 switch 語(yǔ)句
您可以把一個(gè) switch 作為一個(gè)外部 switch 的語(yǔ)句序列的一部分,即可以在一個(gè) switch 語(yǔ)句內(nèi)使用另一個(gè) switch 語(yǔ)句。即使內(nèi)部和外部 switch 的 case 常量包含共同的值,也沒(méi)有矛盾。
語(yǔ)法
C 語(yǔ)言中 嵌套 switch 語(yǔ)句的語(yǔ)法:
switch(表達(dá)式)
{
case 常量表達(dá)式1:語(yǔ)句1;
case 常量表達(dá)式2:語(yǔ)句2;
...
default:語(yǔ)句n+1;
}
switch(ch1) {
case 'A':
printf("這個(gè) A 是外部 switch 的一部分" );
switch(ch2) {
case 'A':
printf("這個(gè) A 是內(nèi)部 switch 的一部分" );
break;
case 'B': /* 內(nèi)部 B case 代碼 */
}
break;
case 'B': /* 外部 B case 代碼 */
}
實(shí)例
#include <stdio.h>
int main ()
{
/* 局部變量定義 */
int a = 100;
int b = 200;
switch(a) {
case 100:
printf("這是外部 switch 的一部分\n");
switch(b) {
case 200:
printf("這是內(nèi)部 switch 的一部分\n");
}
}
printf("a 的準(zhǔn)確值是 %d\n", a );
printf("b 的準(zhǔn)確值是 %d\n", b );
return 0;
}
這是外部 switch 的一部分
這是內(nèi)部 switch 的一部分
a 的準(zhǔn)確值是 100
b 的準(zhǔn)確值是 200
? : 運(yùn)算符(三元運(yùn)算符)
我們已經(jīng)在前面的章節(jié)中講解了 條件運(yùn)算符 ? :,可以用來(lái)替代 if...else 語(yǔ)句。它的一般形式如下:
Exp1 ? Exp2 : Exp3;
其中,Exp1、Exp2 和 Exp3 是表達(dá)式。請(qǐng)注意,冒號(hào)的使用和位置。
? 表達(dá)式的值是由 Exp1 決定的。如果 Exp1 為真,則計(jì)算 Exp2 的值,結(jié)果即為整個(gè) ? 表達(dá)式的值。如果 Exp1 為假,則計(jì)算 Exp3 的值,結(jié)果即為整個(gè) ? 表達(dá)式的值。

實(shí)例
以下實(shí)例通過(guò)輸入一個(gè)數(shù)字來(lái)判斷它是否為奇數(shù)或偶數(shù)
實(shí)例
#include<stdio.h>
int main()
{
int num;
printf("輸入一個(gè)數(shù)字 : ");
scanf("%d",&num);
(num%2==0)?printf("偶數(shù)"):printf("奇數(shù)");
}
循環(huán)
有的時(shí)候,我們可能需要多次執(zhí)行同一塊代碼。一般情況下,語(yǔ)句是按順序執(zhí)行的:函數(shù)中的第一個(gè)語(yǔ)句先執(zhí)行,接著是第二個(gè)語(yǔ)句,依此類推。
編程語(yǔ)言提供了更為復(fù)雜執(zhí)行路徑的多種控制結(jié)構(gòu)。
循環(huán)語(yǔ)句允許我們多次執(zhí)行一個(gè)語(yǔ)句或語(yǔ)句組,下面是大多數(shù)編程語(yǔ)言中循環(huán)語(yǔ)句的流程圖:

循環(huán)類型
C 語(yǔ)言提供了以下幾種循環(huán)類型。點(diǎn)擊鏈接查看每個(gè)類型的細(xì)節(jié)。
| 循環(huán)類型 | 描述 |
|---|---|
| while 循環(huán) | 當(dāng)給定條件為真時(shí),重復(fù)語(yǔ)句或語(yǔ)句組。它會(huì)在執(zhí)行循環(huán)主體之前測(cè)試條件。 |
| for 循環(huán) | 多次執(zhí)行一個(gè)語(yǔ)句序列,簡(jiǎn)化管理循環(huán)變量的代碼。 |
| do...while 循環(huán) | 除了它是在循環(huán)主體結(jié)尾測(cè)試條件外,其他與 while 語(yǔ)句類似。 |
| 嵌套循環(huán) | 您可以在 while、for 或 do..while 循環(huán)內(nèi)使用一個(gè)或多個(gè)循環(huán)。 |
while 循環(huán)
只要給定的條件為真,C 語(yǔ)言中的 while 循環(huán)語(yǔ)句會(huì)重復(fù)執(zhí)行一個(gè)目標(biāo)語(yǔ)句。
語(yǔ)法
C 語(yǔ)言中 while 循環(huán)的語(yǔ)法:
while(condition)
{
statement(s);
}
在這里,statement(s) 可以是一個(gè)單獨(dú)的語(yǔ)句,也可以是幾個(gè)語(yǔ)句組成的代碼塊。
condition 可以是任意的表達(dá)式,當(dāng)為任意非零值時(shí)都為 true。當(dāng)條件為 true 時(shí)執(zhí)行循環(huán)。 當(dāng)條件為 false 時(shí),退出循環(huán),程序流將繼續(xù)執(zhí)行緊接著循環(huán)的下一條語(yǔ)句。
流程圖

在這里,while 循環(huán)的關(guān)鍵點(diǎn)是循環(huán)可能一次都不會(huì)執(zhí)行。當(dāng)條件為 false 時(shí),會(huì)跳過(guò)循環(huán)主體,直接執(zhí)行緊接著 while 循環(huán)的下一條語(yǔ)句。
#include <stdio.h>
int main ()
{
/* 局部變量定義 */
int a = 10;
/* while 循環(huán)執(zhí)行 */
while( a < 20 )
{
printf("a 的值: %d\n", a);
a++;
}
return 0;
}
for 循環(huán)
for 循環(huán)允許您編寫(xiě)一個(gè)執(zhí)行指定次數(shù)的循環(huán)控制結(jié)構(gòu)。
語(yǔ)法
C 語(yǔ)言中 for 循環(huán)的語(yǔ)法:
for ( init; condition; increment )
{ statement(s); }
下面是 for 循環(huán)的控制流:
- init 會(huì)首先被執(zhí)行,且只會(huì)執(zhí)行一次。這一步允許您聲明并初始化任何循環(huán)控制變量。您也可以不在這里寫(xiě)任何語(yǔ)句,只要有一個(gè)分號(hào)出現(xiàn)即可。
- 接下來(lái),會(huì)判斷 condition。如果為真,則執(zhí)行循環(huán)主體。如果為假,則不執(zhí)行循環(huán)主體,且控制流會(huì)跳轉(zhuǎn)到緊接著 for 循環(huán)的下一條語(yǔ)句。
- 在執(zhí)行完 for 循環(huán)主體后,控制流會(huì)跳回上面的 increment 語(yǔ)句。該語(yǔ)句允許您更新循環(huán)控制變量。該語(yǔ)句可以留空,只要在條件后有一個(gè)分號(hào)出現(xiàn)即可。
- 條件再次被判斷。如果為真,則執(zhí)行循環(huán),這個(gè)過(guò)程會(huì)不斷重復(fù)(循環(huán)主體,然后增加步值,再然后重新判斷條件)。在條件變?yōu)榧贂r(shí),for 循環(huán)終止。
流程圖

#include <stdio.h>
int main ()
{
/* for 循環(huán)執(zhí)行 */
for( int a = 10; a < 20; a = a + 1 )
{
printf("a 的值: %d\n", a);
}
return 0;
}
do...while 循環(huán)
不像 for 和 while 循環(huán),它們是在循環(huán)頭部測(cè)試循環(huán)條件。在 C 語(yǔ)言中,do...while 循環(huán)是在循環(huán)的尾部檢查它的條件。
do...while 循環(huán)與 while 循環(huán)類似,但是 do...while 循環(huán)會(huì)確保至少執(zhí)行一次循環(huán)。
語(yǔ)法
C 語(yǔ)言中 do...while 循環(huán)的語(yǔ)法:
do
{
statement(s);
}while( condition );
請(qǐng)注意,條件表達(dá)式出現(xiàn)在循環(huán)的尾部,所以循環(huán)中的 statement(s) 會(huì)在條件被測(cè)試之前至少執(zhí)行一次。
如果條件為真,控制流會(huì)跳轉(zhuǎn)回上面的 do,然后重新執(zhí)行循環(huán)中的 statement(s)。這個(gè)過(guò)程會(huì)不斷重復(fù),直到給定條件變?yōu)榧贋橹埂?/p>

#include <stdio.h>
int main ()
{
/* 局部變量定義 */
int a = 10;
/* do 循環(huán)執(zhí)行 */
do
{
printf("a 的值: %d\n", a);
a = a + 1;
}while( a < 20 );
return 0;
}
C 嵌套循環(huán)
C 語(yǔ)言中 嵌套 for 循環(huán) 語(yǔ)句的語(yǔ)法:

C 語(yǔ)言中 嵌套 do...while 循環(huán) 語(yǔ)句的語(yǔ)法:

循環(huán)控制語(yǔ)句
循環(huán)控制語(yǔ)句改變你代碼的執(zhí)行順序。通過(guò)它你可以實(shí)現(xiàn)代碼的跳轉(zhuǎn)。
C 提供了下列的循環(huán)控制語(yǔ)句。點(diǎn)擊鏈接查看每個(gè)語(yǔ)句的細(xì)節(jié)。
| 控制語(yǔ)句 | 描述 |
|---|---|
| break 語(yǔ)句 | 終止循環(huán)或 switch 語(yǔ)句,程序流將繼續(xù)執(zhí)行緊接著循環(huán)或 switch 的下一條語(yǔ)句。 |
| continue 語(yǔ)句 | 告訴一個(gè)循環(huán)體立刻停止本次循環(huán)迭代,重新開(kāi)始下次循環(huán)迭代。 |
| goto 語(yǔ)句 | 將控制轉(zhuǎn)移到被標(biāo)記的語(yǔ)句。但是不建議在程序中使用 goto 語(yǔ)句。 |
break 語(yǔ)句
C 語(yǔ)言中 break 語(yǔ)句有以下兩種用法:
- 當(dāng) break 語(yǔ)句出現(xiàn)在一個(gè)循環(huán)內(nèi)時(shí),循環(huán)會(huì)立即終止,且程序流將繼續(xù)執(zhí)行緊接著循環(huán)的下一條語(yǔ)句。
- 它可用于終止 switch 語(yǔ)句中的一個(gè) case。
如果您使用的是嵌套循環(huán)(即一個(gè)循環(huán)內(nèi)嵌套另一個(gè)循環(huán)),break 語(yǔ)句會(huì)停止執(zhí)行最內(nèi)層的循環(huán),然后開(kāi)始執(zhí)行該塊之后的下一行代碼。
語(yǔ)法
C 語(yǔ)言中 break 語(yǔ)句的語(yǔ)法:
break;

#include <stdio.h>
int main ()
{
/* 局部變量定義 */
int a = 10;
/* while 循環(huán)執(zhí)行 */
while( a < 20 )
{
printf("a 的值: %d\n", a);
a++;
if( a > 15)
{
/* 使用 break 語(yǔ)句終止循環(huán) */
break;
}
}
return 0;
}
continue 語(yǔ)句
C 語(yǔ)言中的 continue 語(yǔ)句有點(diǎn)像 break 語(yǔ)句。但它不是強(qiáng)迫終止,continue 會(huì)跳過(guò)當(dāng)前循環(huán)中的代碼,強(qiáng)迫開(kāi)始下一次循環(huán)。
對(duì)于 for 循環(huán),continue 語(yǔ)句執(zhí)行后自增語(yǔ)句仍然會(huì)執(zhí)行。對(duì)于 while 和 do...while 循環(huán),continue 語(yǔ)句重新執(zhí)行條件判斷語(yǔ)句。
語(yǔ)法
C 語(yǔ)言中 continue 語(yǔ)句的語(yǔ)法:
continue;
流程圖

goto 語(yǔ)句
C 語(yǔ)言中的 goto 語(yǔ)句允許把控制無(wú)條件轉(zhuǎn)移到同一函數(shù)內(nèi)的被標(biāo)記的語(yǔ)句。
注意:在任何編程語(yǔ)言中,都不建議使用 goto 語(yǔ)句。因?yàn)樗沟贸绦虻目刂屏麟y以跟蹤,使程序難以理解和難以修改。任何使用 goto 語(yǔ)句的程序可以改寫(xiě)成不需要使用 goto 語(yǔ)句的寫(xiě)法。
語(yǔ)法
C 語(yǔ)言中 goto 語(yǔ)句的語(yǔ)法:
goto label;
..
.
label: statement;
在這里,label 可以是任何除 C 關(guān)鍵字以外的純文本,它可以設(shè)置在 C 程序中 goto 語(yǔ)句的前面或者后面。

#include <stdio.h>
int main ()
{
/* 局部變量定義 */
int a = 10;
/* do 循環(huán)執(zhí)行 */
LOOP:do
{
if( a == 15)
{
/* 跳過(guò)迭代 */
a = a + 1;
goto LOOP;
}
printf("a 的值: %d\n", a);
a++;
}while( a < 20 );
return 0;
}
無(wú)限循環(huán)
如果條件永遠(yuǎn)不為假,則循環(huán)將變成無(wú)限循環(huán)。for 循環(huán)在傳統(tǒng)意義上可用于實(shí)現(xiàn)無(wú)限循環(huán)。由于構(gòu)成循環(huán)的三個(gè)表達(dá)式中任何一個(gè)都不是必需的,您可以將某些條件表達(dá)式留空來(lái)構(gòu)成一個(gè)無(wú)限循環(huán)。
實(shí)例
#include <stdio.h>
int main ()
{
for( ; ; )
{
printf("該循環(huán)會(huì)永遠(yuǎn)執(zhí)行下去!\n");
}
return 0;
}
當(dāng)條件表達(dá)式不存在時(shí),它被假設(shè)為真。您也可以設(shè)置一個(gè)初始值和增量表達(dá)式,但是一般情況下,C 程序員偏向于使用 for(;;) 結(jié)構(gòu)來(lái)表示一個(gè)無(wú)限循環(huán)。