goto語句
如果我們想要實現從0輸出到n,如果要寫0~100的話那我們就要寫100個printf,這樣非常麻煩,也
不現實,在彙編中當程序print完了我們可以用一個jmp讓它回去繼續輸出,在C語言中一樣可以實現,
我們可以用goto語句。
例子:
#include <stdio.h> //頭文件
#include <windows.h>
void function(int x) //定義函數
{
int i = 0; //定義變量
B: //設置返回點
printf("%d \n",i); //輸出i的值
i++; //在i的基礎上進行自加
if(i<=x) //進行判斷
goto B; //返回到B
return; //函數結束
}
void main() //程序入口
{
function(10000); //調用函數並傳參
return; //程序結束
}
運行結果:
我們可以去看一下反彙編,這裏的goto對應的就是jmp:
循環語句的類型
在C語言中循環語句的類型有以下三種:
while語句
do..while語句
for語句
while語句
while語句格式
while(表達式)
{
語句;
}
剛纔的例子在這裏用while來實現也很簡單:
#include <stdio.h> //頭文件
#include <windows.h>
void function(int x) //定義函數
{
int i = 0; //定義變量
A: while(i<=x) //開始循環
{
printf("%d\n",i); //若循環判斷成立則輸出i的值
i++; //i自加,並跳回到A,直至判斷不成立跳出while語句
}
return; //函數結束
}
void main() //程序入口
{
function(10000); //調用函數並傳參
return; //程序結束
}
這裏寫A純屬是爲了方便理解,正常寫完保存是會報警告的,看一下運行結果:
死循環
while判斷是否進入循環就兩個結果,0和1,如果是0就跳出去,如果是1就跳進去,那麼死循環就不難理解了,while(1)就行了,程序就會無限輸出,直至死機。
例子:
#include <stdio.h> //頭文件
#include <windows.h>
void function(int x) //定義函數
{
int i = 0; //定義變量
while(1) //開始循環(無限循環)
{
printf("%d\n",i); //若循環判斷成立則輸出i的值
i++; //i自加,並跳回到A,直至判斷不成立跳出while語句
}
return; //函數結束
}
void main() //程序入口
{
function(10000); //調用函數並傳參
return; //程序結束
}
運行結果:
語句的嵌套
格式
while(表達式)
{
其他語句
}
現在我們把例子改一下,要求輸出1~100內所有的偶數:
#include <stdio.h> //頭文件
#include <windows.h>
void function(int x) //定義函數
{
int i = 0; //定義變量
while(i<=x) //開始循環
{
if(i%2 == 0) //i的值對2取餘,若爲零則進行輸出
{
printf("%d\n",i); //若循環判斷成立則輸出i的值
}
i++; //i自加,並跳回到A,直至判斷不成立跳出while語句
}
return; //函數結束
}
void main() //程序入口
{
function(100); //調用函數並傳參
return; //程序結束
}
運行結果:
do…while語句
do..while語句格式
do
{
語句
}while(表達式);
當程序運行到while時判斷若爲零則跳回繼續執行,反之跳出,即使判斷不成立,也會執行一次。
例子:
#include <stdio.h> //頭文件
#include <windows.h>
void main() //程序入口
{
int day = 1; //定義局部變量
do //開始循環
{
printf("%d\n", day); //輸出參數
day++; //參數自加
}while (day <= 31); //判斷是否大於31,大於跳出循環
return; //程序結束
}
運行結果:
在彙編中,do…while與while的區別是,while先進行判斷,在進行輸出,而do…while則是,先輸出一次,在進行判斷,若符合則輸出,不符合則跳出循環。
for語句
格式
for(表達式1;表達式2;表達式3)
{
需要執行的代碼4
}
這裏表達式1與表達式3沒有什麼特定的要求,但是表達式2必須要有返回值。
執行順序:
第一次:1243
第二次:243
第三次:243
...
若表達式2不成立則跳出循環,執行後面的語句。
例子:
#include <stdio.h> //頭文件
#include <windows.h>
void Q1() //定義函數Q1
{
printf("Q1 \n");
}
int Q2() //定義函數Q2
{
printf("Q2 \n");
return -1;
}
void Q3() //定義函數Q3
{
printf("Q3 \n");
}
void testfor() //定義函數testfor
{
for(Q1();Q2();Q3()) //開始for循環,調用前面的三個函數
{
printf("Q4 \n"); //執行完Q1執行Q2,條件符合執行Q4,在執行Q3
}
return; //循環結束
}
void mian() //程序入口
{
testfor(); //調用testfor()函數
return; //程序結束
}
這裏可以看到,程序的運行順序是1、2、4、3、2、4、3、2、4、3…:
現在我們可以用for語句來輸出1~100的值了:
#include <stdio.h> //頭文件
#include <windows.h>
void testfor() //定義函數
{
for(int i = 0;i>100;i++) //定義for循環的三個表達式
{
printf("%d \n"); //輸出結果
}
return; //循環結束
}
void mian() //程序入口
{
testfor(); //調用testfor()函數
return; //程序結束
}
這裏有兩點需要說明:
第一、for循環的三個表達式可以省略,但是分號不可以省略。
例如:
for(;;)
{
printf("默認成立 \n");
}
for(;-1;)
{
printf("第二個表達式非零就成立");
}
for(;0;)
{
printf("不成立 \n");
}
第二、for循環的第一三表達式可以使用逗號。
例如:
int x;
int y;
int z;
for(x = 0,y = 0,z = 0:x<10;x++,y++,z++)
{
printf("%d %d %d \n",x,y,z);
}