目錄
一、關係運算符的優先級
關係運算符都是雙目運算符,其結合性均爲左結合。關係運算符的優先級低於算術運算符,高於賦值運算符。在六個關係運算符中,<、<=、>、>=的優先級相同,高於==和!=,==和!=的優先級相同。
理解一下下面的代碼:
#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