goto 語句
無條件轉(zhuǎn)移控制流。
當(dāng)使用其他語句不可能將控制轉(zhuǎn)移到所需位置時(shí)使用。
語法
屬性(可選) goto 標(biāo)號(hào) ;
C++解釋
goto 語句將控制轉(zhuǎn)移到標(biāo)號(hào)所指定的位置。goto 語句必須與它所用的 標(biāo)號(hào) 處于相同的函數(shù)中,它出現(xiàn)于標(biāo)號(hào)的前后均可。
若控制的轉(zhuǎn)移退出了任何自動(dòng)變量的作用域(例如通過回跳到這種變量聲明之前的位置,或向前跳出作為變量作用域的復(fù)合語句),則為所有退出作用域的變量以其構(gòu)造順序的逆序調(diào)用析構(gòu)函數(shù)。
goto 不能將控制轉(zhuǎn)移到 try 塊或 catch 子句之內(nèi),但能將控制轉(zhuǎn)移離開 try 塊或 catch 子句(遵循上述有關(guān)作用域中的自動(dòng)變量的規(guī)則)
若控制被轉(zhuǎn)移進(jìn)入了任何自動(dòng)變量的作用域(例如通過向前跳過聲明語句),則程序非良構(gòu)(不能編譯),除非進(jìn)入作用域的所有變量擁有
- 標(biāo)量類型,且聲明不帶初始化器
- 擁有平凡默認(rèn)構(gòu)造函數(shù)和析構(gòu)函數(shù)的類類型,且聲明不帶初始化器
- 上述之一的 cv 限定版本
- 上述之一的數(shù)組
(注意:相同規(guī)則適用于控制轉(zhuǎn)移的所有形式)
注意
在 C 編程語言中,goto 語句的限制較少,并且能進(jìn)入除變長數(shù)組或可變修改指針之外的任何變量的作用域。
C解釋
goto 語句導(dǎo)致無條件跳轉(zhuǎn)(控制的轉(zhuǎn)譯)到前附具名 標(biāo)號(hào) (必須與 goto 語句出現(xiàn)于同一函數(shù)中)的語句,除非此跳轉(zhuǎn)會(huì)進(jìn)入變長度數(shù)組或另一可變修改類型的作用域 (C99 起)。
標(biāo)號(hào) 是一個(gè)后隨冒號(hào)( : )和一條語句的的標(biāo)識(shí)符。標(biāo)號(hào)是僅有的擁有函數(shù)作用域的標(biāo)識(shí)符:能在其所出現(xiàn)于的函數(shù)中的任何位置使用它們(在 goto 語句中)。任何語句前可以有多個(gè)標(biāo)號(hào)。
goto lab1; // OK :進(jìn)入常規(guī)變量的作用域 int n = 5; lab1:; // 注意未初始化 n ,如同以 int n; 聲明 // goto lab2; // 錯(cuò)誤:進(jìn)入二個(gè) VM 類型的作用域 double a[n]; // VLA int (*p)[n]; // VM 指針 lab2:
若 goto 離開 VLA 的作用域,則 VLA 會(huì)被解分配(而且可能會(huì)被再分配,若再度執(zhí)行其初始化):
{
int n = 1;
label:;
int a[n]; // 重分配 10 次,每次擁有不同的大小
if (n++ < 10) goto label; // 離開 VM 的作用域
}
示例
#include <stdio.h>
int main(void)
{
// goto 可用于簡單地離開多層循環(huán)
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 3; y++) {
printf("(%d;%d)n",x,y);
if (x + y >= 3) goto endloop;
}
}
endloop:;
}
輸出:
(0;0) (0;1) (0;2) (1;0) (1;1) (1;2)






