goto 語句是最經(jīng)典的計算機語句,叫“無條件轉(zhuǎn)向語句”,執(zhí)行到它,無條件地跳到指定的標號所在地。
漢壽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
下面程序讀入fin_list的一行,每一行是一個文件名。
[許多語句] 用來處理一個文件,處理完了goto entrance 又回到開始,再讀一個文件名。讀到fin_list結(jié)束,goto No_More,跳到No_More:
退出這段程序。
entrance:
if ( fgets(one_line,200,fin_list) ==NULL) goto No_More;
....[許多語句]
....
goto entrance;
No_More: fclose(fin_list);
轉(zhuǎn)向語句與標號配合使用。函數(shù)塊里,標號名不可重名,(標號名如同路標)。例如,可以有多個 goto No_More 語句,但只可有 一個No_More:;
轉(zhuǎn)向語句只能從程序內(nèi)層轉(zhuǎn)向同一層或外層,但不可轉(zhuǎn)向它的內(nèi)層。
例如(正確的):
for (j=0;jn;j++){
Lab1:;
for (i=0;im;i++){
...
if (..) goto Lab1;
if (..) goto Lab2;
if (..) goto Lab3;
if (..) goto Lab4;
Lab2:;
...
}
...
Lab3:;
}
Lab4:;
例如(錯的):
for (j=0;jn;j++){
if () goto Lab1:;
for (i=0;im;i++){
...
Lab1:;
...
}};
goto 不可跳出自己在的函數(shù)塊。
這個問題很有意思。說說我的猜測吧,不一定對。
{
int y = 3;
a:
...
}
這是一個類似一個小函數(shù)的作用域,int y = 3;在編譯的時候會被拆分成 int y; y = 3;兩條語句。
int y;這是定義一個局部變量,在函數(shù)壓棧的時候就給他分配了地址,這個作用域使用y的時候會從這個地址取值,而不是上邊定義的那個int y=0; 而用goto語句跳到 標簽a的時候,就會把y=3這條語句給跳過了,所以此時y的值是一個隨機數(shù)。
以上觀點純粹為個人猜測,如有不對望指正
goto語句是一種無條件轉(zhuǎn)移語句,與BASIC中的goto語句相似。goto語句的使用格式為:goto 標號;
其中標號是Turbo C2.0中一個有效的標識符,這個標識符加上一個:一起出現(xiàn)在函數(shù)內(nèi)某處,執(zhí)行 goto
語句后,程序?qū)⑻D(zhuǎn)到該標號處并執(zhí)行其后的語句。標號既然是一個標識符,也就要滿足標識符的命名規(guī)則。另外標號必須與goto 語句同處于一個函數(shù)中,但可以不在一個循環(huán)層中。通常goto語句與if條件語句連用,當滿足某一條件時,程序跳到標號處運行。goto語句通常不用,主要因為它將使程序?qū)哟尾磺?,且不易讀,但在多層嵌套退出時,用goto語句則比較合理。
goto語句可以使程序在沒有任何條件的情況下跳轉(zhuǎn)到指定的位置,所以goto語句又被稱為是無條件跳轉(zhuǎn)語句。
它的語法如下
goto label;
//其它代碼
label:
其中,label為我們自己定義的一個標簽,定義的規(guī)則與變量的命名相同,它的位置是不固定的,它可以寫在goto語句的后面,也可以寫在它的前面,然而goto語句只能在一個函數(shù)內(nèi)部跳轉(zhuǎn),它并不允許跳轉(zhuǎn)出一個函數(shù)外部。
int day = 1;
loop:
if (day = 31)
{
printf("%d\n", day);
day++;
goto loop;
}
上面程序就是利用了goto和if語句來實現(xiàn)了循環(huán)功能,它與while實現(xiàn)的循環(huán)功能一樣,其中l(wèi)oop為我們定義的一個label(標簽)。
擴展資料:
使用goto語句的建議
1) 使用goto語句只能goto到同一函數(shù)內(nèi),而不能從一個函數(shù)里goto到另外一個函數(shù)里。
2) 使用goto語句在同一函數(shù)內(nèi)進行g(shù)oto時,goto的起點應(yīng)是函數(shù)內(nèi)一段小功能的結(jié)束處,goto的目的label處應(yīng)是函數(shù)內(nèi)另外一段小功能的開始處。
3) 不能從一段復(fù)雜的執(zhí)行狀態(tài)中的位置goto到另外一個位置,比如,從多重嵌套的循環(huán)判斷中跳出去就是不允許的。
4)應(yīng)該避免向兩個方向跳轉(zhuǎn)。這樣最容易導致"面條代碼"。
參考資料來源:百度百科-goto語句
書上示例的意思是,前面判斷成立則跳轉(zhuǎn)到標簽所在的代碼行執(zhí)行,如果不成立則按順序執(zhí)行,
laststep:printf("Step 3\n");
這行代碼也會執(zhí)行,
laststep: 這個標簽只是說明,如果goto這個標簽的話就跳到這句接著往后執(zhí)行 沒有g(shù)oto就會"無視"它
可以試試這樣
#includestdio.h
int main(void)
{
int i = 1;
printf("Step 2\n");
laststep:printf("Step 3\n");
if(i--)
{
goto laststep;
}
return 0 ;
}
看看"Step 3"輸出幾次
標簽本身沒有作用域的,只是一個標志點。
但是goto本身有限制,只能是當前函數(shù)。所以,從這個角度來說,標簽的作用域也可以說是當前函數(shù)。
比如
void?func()
{
int?a;
a=0;
loop:
a++;
if(a10)?goto?loop;
printf("%d",a);
}
這個程序中,loop標簽就與goto配合起到了跳轉(zhuǎn)作用。
對于goto來說,這個標簽只要是在本函數(shù)內(nèi)的就是合法的,無論是在goto前還是goto后。
但是,如下程序:
int?a?=?0;
void?func1(void)
{
loop:
printf("%d",a);
}
void?func2(void)
{
a++;
if(a10)goto?loop;
}
在func2中調(diào)用goto使用了func1中的標簽loop,在編譯的時候就會報錯。因為使用goto時只會在本函數(shù)中查找該標簽。