C語言歸納三-C語言循環結構和選擇結構

目錄

 

一、關係運算符的優先級

二、邏輯運算符

2.1 &&,||,!。

2.2 邏輯符的優先級

三、switch語句

四、條件運算符

五、循環

5.1 while循環

5.2 do while循環

5.3 for循環

六、break和continue解釋

6.1 break

6.2 continue語句


一、關係運算符的優先級

關係運算符都是雙目運算符,其結合性均爲左結合。關係運算符的優先級低於算術運算符,高於賦值運算符。在六個關係運算符中,<、<=、>、>=的優先級相同,高於==和!=,==和!=的優先級相同。

理解一下下面的代碼:

#include <stdio.h>
int main(){
    char c='k';
    int i=1, j=2, k=3;
    float x=3e+5, y=0.85;
    int result_1 = 'a'+5<c, result_2 = x-5.25<=x+y;
    printf( "%d, %d\n", result_1, -i-2*j>=k+1 );
    printf( "%d, %d\n", 1<j<5, result_2 );
    printf( "%d, %d\n", i+j+k==-2*j, k==j==i+5 );
    return 0;

輸出結果:

1, 0
1, 1
0, 0
對於含多個關係運算符的表達式,如 k==j==i+5,根據運算符的左結合性,
先計算k==j,該式不成立,其值爲0,再計算0==i+5,也不成立,故表達式值爲0。

下面的這個代碼有點意思,是while((c=getchar())!='\n'&&c!=EOF)的解釋。代碼如下:

if(a=b)
    printf("%d",a);
else
    printf("a=0");

意思是,把 b 的值賦予 a,如果爲非0輸出a的值。這種用法在後面的程序中會經常出現。

二、邏輯運算符

2.1 &&,||,!。

&&:參與運算的兩個表達式都爲真時,結果才爲真,否則爲假。例如:

5&&0

5爲真,0爲假,相與的結果爲假,也就是 0。

2.2 邏輯符的優先級

賦值運算符(=) < &&和|| < 關係運算符 < 算術運算符 < 非(!)

&& 和 || 低於關係運算符,! 高於算術運算符。

按照運算符的優先順序可以得出:

  • a>b && c>d  等價於  (a>b)&&(c>d)
  • !b==c||d<a  等價於  ((!b)==c)||(d<a)
  • a+b>c&&x+y<b  等價於  ((a+b)>c)&&((x+y)<b)

邏輯運算符舉例:

#include <stdio.h>
int main(){
    char c='k';
    int i=1,j=2,k=3;
    float x=3e+5,y=0.85;
    printf( "%d,%d\n", !x*!y, !!!x );
    printf( "%d,%d\n", i&&j-3, i<j&&x<y );
    先計算j-3的值爲非0,再求i && j-3的邏輯值爲1.
    printf( "%d,%d\n", i==5&&c&&(j=8), x+y||i+j+k );
    return 0;
}
運行結果:
0,0
1,0
0,1

三、switch語句

首先一個示例代碼:

#include <stdio.h>
int main(){
    int a;
    printf("Input integer number:");
    scanf("%d",&a);
    switch(a){
        case 1: printf("Monday\n"); break;
        case 2: printf("Tuesday\n"); break;
        case 3: printf("Wednesday\n"); break;
        case 4: printf("Thursday\n"); break;
        case 5: printf("Friday\n"); break;
        case 6: printf("Saturday\n"); break;
        case 7: printf("Sunday\n"); break;
        default:printf("error\n"); break;
    }
    return 0;
}

接下來是需要注意的點:

(1)switch後面是一個表達式,可以有變量。

但是case 後面必須是一個整數,或者是結果爲整數的表達式,但不能包含任何變量。請看下面的例子:

case 10: printf("..."); break;  //正確
case 8+9: printf("..."); break;  //正確
case 'A': printf("..."); break;  //正確,字符和整數可以相互轉換
case 'A'+19: printf("..."); break;  //正確,字符和整數可以相互轉換
case 9.5: printf("..."); break;  //錯誤,不能爲小數
case a: printf("..."); break;    //錯誤,不能包含變量
case a+10: printf("..."); break;  //錯誤,不能包含變量

(2)break必須存在,default 不是必須的。當沒有 default 時,如果所有 case 都匹配失敗,那麼就什麼都不執行。

四、條件運算符

max = (a>b) ? a : b;

該語句的語義是:如a>b爲真,則把a賦予max,否則把b 賦予max。

條件運算符(?:)的優先級低於關係運算符和算術運算符,但高於賦值符。因此上述代碼可以去掉括號應用。

條件運算符的結合方向是自右至左。例如:

a>b ? a : c>d ? c : d;
應理解爲:
a>b ? a : ( c>d ? c : d );

五、循環

5.1 while循環

5.2 do while循環

do-while循環與while循環的不同在於:它會先執行“語句塊”,然後再判斷表達式是否爲真,如果爲真則繼續循環;如果爲假,則終止循環。因此,do-while 循環至少要執行一次“語句塊”。格式如下,注意while括號後面有分號。

do{
        sum+=i;
        i++;
    }while(i<=100);

5.3 for循環

思想:1) 先執行“表達式1”。

2) 再執行“表達式2”,如果它的值爲真(非0),則執行循環體,否則結束循環。

3) 執行完循環體後再執行“表達式3”。

4) 重複執行步驟 2) 和 3),直到“表達式2”的值爲假,就結束循環。

特殊點:

for( ; ; )  語句     相當於:   while(1)  語句

六、break和continue解釋

6.1 break

If break和while(1)真的是一個不錯的搭配。

在多層循環中,一個 break 語句只向外跳一層。

簡單舉例:

#include <stdio.h>
int main(){
    int i=1, j;
    while(1){  // 外層循環
        j=1;
        while(1){  // 內層循環
            printf("%-4d", i*j);
            j++;
            if(j>4) break;  //跳出內層循環
        }
        printf("\n");
        i++;
        if(i>4) break;  // 跳出外層循環
    }
    return 0;
}
運行結果:
1   2   3   4
2   4   6   8
3   6   9   12
4   8   12  16

6.2 continue語句

break是直接離它最近的一層循環就終止了。

continue是離它最近的一層循環仍然繼續,只不過這層循環的該次continue後面的語句不再執行了,直接跳到下一次。

break和它的區別就是break不跳到下一次了,沒得跳了,終止了。不想舉例子,算了還是舉例子吧。

#include <stdio.h>
int main(){
    char c = 0;
    while(c!='\n'){  //回車鍵結束循環
        c=getchar();
        if(c=='4' || c=='5'){  //按下的是數字鍵4或5
            continue;  //跳過當次循環,進入下次循環
        }
        putchar(c);
    }
    return 0;
}
運行結果:
0123456789↙
01236789

C語言求π的值:http://c.biancheng.net/cpp/html/2813.html

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章