?? caibook3.01
字號:
for(;;)省去了全部表達式。
2.在循環變量已賦初值時,可省去表達式1,如例3.27即屬于這種情
形。如省去表達式2或表達式3則將造成無限循環, 這時應在循環
體內設法結束循環。例題即屬于此情況。void main(){
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;n>0;)
{ a++;n--;
printf("%d ",a*2);
}
} int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;n>0;)
{ a++;n--;
printf("%d ",a*2);
} 本例中省略了表達式1和表達式3,由循環體內的n--語句進行循
環變量n的遞減,以控制循環次數。void main(){
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;;){
a++;n--;
printf("%d ",a*2);
if(n==0)break;
}
}
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;;){
a++;n--;
printf("%d ",a*2);
if(n==0)break;
} 本例中for語句的表達式全部省去。由循環體中的語句實現循環
變量的遞減和循環條件的判斷。當n值為0時,由break語句中止循環,
轉去執行for以后的程序。在此情況下,for語句已等效于while( 1)
語句。如在循環體中沒有相應的控制手段,則造成死循環。3.循環體可以是空語句。
#include"stdio.h"
void main(){
int n=0;
printf("input a string:\n");
for(;getchar()!='\n';n++);
printf("%d",n);
}
本例中,省去了for語句的表達式1,表達式3也不是用來修改循
環變量,而是用作輸入字符的計數。這樣, 就把本應在循環體中完
成的計數放在表達式中完成了。因此循環體是空語句。應注意的是,
空語句后的分號不可少,如缺少此分號,則把后面的printf 語句當
成循環體來執行。反過來說,如循環體不為空語句時, 決不能在表
達式的括號后加分號, 這樣又會認為循環體是空語句而不能反復執
行。這些都是編程中常見的錯誤,要十分注意。
4.for語句也可與while,do-while語句相互嵌套,構成多重循環。以
下形成都合法的嵌套。(1)for(){…
while()
{…}
…
}
(2)do{
…
for()
{…}
…
}while();(3)while(){
…
for()
{…}
…
}
(4)for(){
…
for(){
…
}
}
void main(){
int i,j,k;
for(i=1;i<=3;i++)
{ for(j=1;j<=3-i+5;j++)
printf(" ");
for(k=1;k<=2*i-1+5;k++)
{
if(k<=5) printf(" ");
else printf("*");
}
printf("\n");
}
}轉移語句
程序中的語句通常總是按順序方向, 或按語句功能所定義的方
向執行的。如果需要改變程序的正常流向, 可以使用本小節介紹的
轉移語句。在C語言中提供了4種轉移語句:goto,break, continue
和return。其中的return語句只能出現在被調函數中, 用于返回主
調函數,我們將在函數一章中具體介紹。 本小節介紹前三種轉移語
句。
1.goto語句
goto語句也稱為無條件轉移語句,其一般格式如下: goto 語句標號; 其中語句標號是按標識符規定書寫的符號, 放在某一語句行的
前面,標號后加冒號(:)。語句標號起標識語句的作用,與goto 語
句配合使用。如: label: i++;
loop: while(x<7);
C語言不限制程序中使用標號的次數,但各標號不得重名。
goto語句的語義是改變程序流向, 轉去執行語句標號所標識的
語句。
goto語句通常與條件語句配合使用。可用來實現條件轉移, 構
成循環,跳出循環體等功能。
但是,在結構化程序設計中一般不主張使用goto語句, 以免造
成程序流程的混亂,使理解和調試程序都產生困難。
統計從鍵盤輸入一行字符的個數。
#include"stdio.h"
void main(){
int n=0;
printf("input a string\n");
loop: if(getchar()!='\n')
{ n++;
goto loop;
}
printf("%d",n);
} int n=0;
printf("input a string\n");
loop: if(getchar()!='\n')
{ n++;
goto loop;
}
printf("%d",n); 本例用if語句和goto語句構成循環結構。當輸入字符不為'\n'
時即執行n++進行計數,然后轉移至if語句循環執行。直至輸入字符
為'\n'才停止循環。
break語句
break語句只能用在switch 語句或循環語句中, 其作用是跳出
switch語句或跳出本層循環,轉去執行后面的程序。由于break語句
的轉移方向是明確的,所以不需要語句標號與之配合。break語句的
一般形式為: break; 上面例題中分別在switch語句和for語句中使用了break 語句作
為跳轉。使用break語句可以使循環語句有多個出口,在一些場合下
使編程更加靈活、方便。
continue語句
continue語句只能用在循環體中,其一般格式是: continue; 其語義是:結束本次循環,即不再執行循環體中continue 語句
之后的語句,轉入下一次循環條件的判斷與執行。應注意的是, 本
語句只結束本層本次的循環,并不跳出循環。void main(){
int n;
for(n=7;n<=100;n++)
{
if (n%7!=0)
continue;
printf("%d ",n);
}
}
輸出100以內能被7整除的數。 int n;
for(n=7;n<=100;n++)
{
if (n%7!=0)
continue;
printf("%d ",n);
}
本例中,對7~100的每一個數進行測試,如該數不能被7整除,
即模運算不為0,則由continus語句轉去下一次循環。只有模運算為
0時,才能執行后面的printf語句,輸出能被7整除的數。#include"stdio.h"
void main(){
char a,b;
printf("input a string:\n");
b=getchar();
while((a=getchar())!='\n'){
if(a==b){
printf("same character\n");
break;
}b=a;
}
}
檢查輸入的一行中有無相鄰兩字符相同。
char a,b;
printf("input a string:\n");
b=getchar();
while((a=getchar())!='\n'){
if(a==b){
printf("same character\n");
break;
}b=a;
} 本例程序中,把第一個讀入的字符送入b。然后進入循環,把下
一字符讀入a,比較a,b是否相等,若相等則輸出提示串并中止循環,
若不相等則把a中的字符賦予b,輸入下一次循環。 輸出100以內的素數。素數是只能被1 和本身整除的數。
可用窮舉法來判斷一個數是否是素數。
void main(){
int n,i;
for(n=2;n<=100;n++){
for(i=2;i<n;i++)
if(n%i==0) break;
if(i>=n) printf("\t%d",n);
}
} int n,i;
for(n=2;n<=100;n++){
for(i=2;i<n;i++)
if(n%i==0) break;
if(i>=n) printf("\t%d",n);
}
本例程序中,第一層循環表示對1~100這100個數逐個判斷是否
是素數,共循環100次,在第二層循環中則對數n用2~n-1逐個去除,
若某次除盡則跳出該層循環,說明不是素數。 如果在所有的數都是
未除盡的情況下結束循環,則為素數,此時有i>=n, 故可經此判斷
后輸出素數。然后轉入下一次大循環。
實際上,2以上的所有偶數均不是素數,因此可以使循環變量的
步長值改為2,即每次增加2,此外只需對數n用2~n去除就可判斷該
數是否素數。這樣將大大減少循環次數,減少程序運行時間。#include"math.h"
void main(){
int n,i,k;
for(n=2;n<=100;n+=2){
k=sqrt(n);
for(i=2;i<k;i++)
if(n%i==0) break;
if(i>=k) printf("\t%2d",n);
}
}小結
1.從程序執行的流程來看, 程序可分為三種最基本的結構: 順序結構,分支結構以及循環結構 2.程序中執行部分最基本的單位是語句。C語言的語句可分為五類:
(1)表達式語句
任何表達式末尾加上分號即可構成表達式語句, 常用的表達式
語句為賦值語句。
(2)函數調用語句
由函數調用加上分號即組成函數調用語句。
(3)控制語句
用于控制程序流程,由專門的語句定義符及所需的表達式組成。
主要有條件判斷執行語句,循環執行語句,轉向語句等。
(4)復合語句
由{}把多個語句括起來組成一個語句。 復合語句被認為是單條
語句,它可出現在所有允許出現語句的地方,如循環體等。
(5)空語句
僅由分號組成,無實際功能。3.C語言中沒有提供專門的輸入輸出語句, 所有的輸入輸出都是由
調用標準庫函數中的輸入輸出函數來實現的。
scanf和getchar函數是輸入函數,接收來自鍵盤的輸入數據。
scanf是格式輸入函數, 可按指定的格式輸入任意類型數據,
getchar函數是字符輸入函數, 只能接收單個字符。
printf和putchar函數是輸出函數,向顯示器屏幕輸出數據。
printf是格式輸出函數,可按指定的格式顯示任意類型的數據。
putchar是字符顯示函數,只能顯示單個字符。
4.關系表達式和邏輯表達式是兩種重要的表達式, 主要用于條件執
行的判斷和循環執行的判斷。5.C語言提供了多種形式的條件語句以構成分支結構。
(1)if語句主要用于單向選擇。
(2)if-else語句主要用于雙向選擇。
(3)if-else-if語和switch語句用于多向選擇。
這幾種形式的條件語句一般來說是可以互相替代的。
6.C語言提供了三種循環語句。
(1)for語句主要用于給定循環變量初值, 步長增量以及循環次數的
循環結構。
(2)循環次數及控制條件要在循環過程中才能確定的循環可用 while
或do-while語句。
(3)三種循環語句可以相互嵌套組成多重循環。循環之間可以并列但
不能交叉。
(4)可用轉移語句把流程轉出循環體外,但不能從外面轉向循環體內。
(5)在循環程序中應避免出現死循環,即應保證循環變量的值在運行
過程中可以得到修改,并使循環條件逐步變為假,從而結束循環。7.C語言語句小結
名 稱 一 般 形 式
簡單語句 表達式語句表達式;
空語句;
復合語句 { 語句 }
條件語句if(表達式)語句;
if(表達式)語句1; else語句2;
if(表達式1)語句1; else if(表達式2) 語句2…else語句 n;
開關語句 switch(表達式){ case常量表達式: 語句…default: 語句; }
循環語句while語句
while(表達式)語句;
for語句 for(表達式1; 表達式2; 表達式3)語句;
break語句 break;
goto語句 goto;
continue語句 continue;
return 語句 return(表達式);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -