C語(yǔ)言學(xué)習(xí)三 — 判斷結(jié)構(gòu)

判斷結(jié)構(gòu)要求程序員指定一個(gè)或多個(gè)要評(píng)估或測(cè)試的條件,以及條件為真時(shí)要執(zhí)行的語(yǔ)句(必需的)和條件為假時(shí)要執(zhí)行的語(yǔ)句(可選的)。

C 語(yǔ)言把任何非零非空的值假定為 true,把null 假定為 false。

下面是大多數(shù)編程語(yǔ)言中典型的判斷結(jié)構(gòu)的一般形式:

if.png

判斷語(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è) ifelse if 語(yǔ)句內(nèi)使用另一個(gè) ifelse 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。

流程圖

image

實(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。

流程圖

image

實(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á)式的值。

img

實(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ǔ)句的流程圖:

loop.png

循環(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ǔ)句。

流程圖

image

在這里,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)的控制流:

  1. init 會(huì)首先被執(zhí)行,且只會(huì)執(zhí)行一次。這一步允許您聲明并初始化任何循環(huán)控制變量。您也可以不在這里寫(xiě)任何語(yǔ)句,只要有一個(gè)分號(hào)出現(xiàn)即可。
  2. 接下來(lái),會(huì)判斷 condition。如果為真,則執(zhí)行循環(huán)主體。如果為假,則不執(zhí)行循環(huán)主體,且控制流會(huì)跳轉(zhuǎn)到緊接著 for 循環(huán)的下一條語(yǔ)句。
  3. 在執(zhí)行完 for 循環(huán)主體后,控制流會(huì)跳回上面的 increment 語(yǔ)句。該語(yǔ)句允許您更新循環(huán)控制變量。該語(yǔ)句可以留空,只要在條件后有一個(gè)分號(hào)出現(xiàn)即可。
  4. 條件再次被判斷。如果為真,則執(zhí)行循環(huán),這個(gè)過(guò)程會(huì)不斷重復(fù)(循環(huán)主體,然后增加步值,再然后重新判斷條件)。在條件變?yōu)榧贂r(shí),for 循環(huán)終止。

流程圖

image

#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)

不像 forwhile 循環(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>

image
#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ǔ)法:

image

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

image

循環(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ǔ)句有以下兩種用法:

  1. 當(dāng) break 語(yǔ)句出現(xiàn)在一個(gè)循環(huán)內(nèi)時(shí),循環(huán)會(huì)立即終止,且程序流將繼續(xù)執(zhí)行緊接著循環(huán)的下一條語(yǔ)句。
  2. 它可用于終止 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;
image
#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ì)于 whiledo...while 循環(huán),continue 語(yǔ)句重新執(zhí)行條件判斷語(yǔ)句。

語(yǔ)法

C 語(yǔ)言中 continue 語(yǔ)句的語(yǔ)法:

continue;

流程圖

image

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ǔ)句的前面或者后面。

image
#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)。

代碼已上傳github,點(diǎn)擊此處即可到達(dá)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • .bat腳本基本命令語(yǔ)法 目錄 批處理的常見(jiàn)命令(未列舉的命令還比較多,請(qǐng)查閱幫助信息) 1、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,537評(píng)論 1 19
  • 個(gè)人學(xué)習(xí)批處理的初衷來(lái)源于實(shí)際工作;在某個(gè)迭代版本有個(gè)BS(安卓手游模擬器)大需求,從而在測(cè)試過(guò)程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,990評(píng)論 0 11
  • 一、C語(yǔ)言的結(jié)構(gòu) 1、Hello world 簡(jiǎn)單來(lái)說(shuō),一個(gè)C程序就是由若干頭文件和函數(shù)組成。 #include ...
    大嘴蝸牛閱讀 66,391評(píng)論 182 117
  • 你有沒(méi) 經(jīng)歷過(guò)這樣的時(shí)刻 準(zhǔn)備presentación的時(shí)候 咖啡喝著,資料查著 ppt也認(rèn)真做了 就是最后得分不...
    烤鴨娘閱讀 8,501評(píng)論 0 56
  • 上個(gè)月東野圭吾出了新書(shū),讀完后覺(jué)得或許以后再也不會(huì)讀東野圭吾了吧,那就此總結(jié)(只是寫(xiě)一寫(xiě)自己喜歡的看法) PA...
    不流蒲束閱讀 518評(píng)論 0 1

友情鏈接更多精彩內(nèi)容