Search…

Từ Khóa goto

06/09/20202 min read
Tìm hiểu về cấu trúc điều khiển goto trong C++.

Cú pháp

Thao tác với goto khá đơn giản. Cú pháp như sau:

goto label_name;
// Several code line
label_name: statement;

Khi gặp từ khoá goto, chương trình sẽ nhảy đến biểu thức gắn nhãn được khai báo. Biểu thức này và dòng code goto bắt buộc phải nằm trong cùng một scope (phạm vi), nếu không chương trình sẽ báo lỗi (error C0294).

Biểu thức được gắn nhãn có thể là bất cứ biểu thức nào, theo sau một định danh và dấu hai chấm.

Sơ đồ hoạt động

 

Một số lưu ý khi sử dụng goto

Do đặc tính nhảy vô điều kiện đến bất kỳ vị trí nào trong hàm nên dễ dẫn đến lỗi chương trình như chưa khai báo hoặc khởi tạo biến. Do đó lập trình viên cần hết sức thận trọng khi quyết định sử dụng goto.

Ngoài ra, sử dụng goto cũng có thể dẫn đến trường hợp lặp vô hạn. Ví dụ sau đây sẽ minh hoạ rõ hơn:

int main()
{
label1: // Some statement
	goto label2;

	// Some statement

label2: // Some statement
	goto label1;

	return 0;
}

Với những chương trình nhỏ, lỗi này dường như có thể được phát hiện dễ dàng. Nhưng hãy tưởng tượng một dự án game cỡ vừa, có hàng chục file mã nguồn, cùng với hàng trăm hàm, biến hỗ trợ. Việc phát hiện ra lỗi này sẽ không hề đơn giản nếu như không cẩn thận ngay từ đầu.

Đa số các trường hợp sử dụng goto đều có các giải pháp thay thế an toàn hơn. Do đó nếu không bắt buộc, nên chọn những giải pháp khác để tránh tối đa rủi ro khi sử dụng.

Tuy nhiên, nếu goto được sử dụng hợp lý, chương trình sẽ rất trực quan và gọn gàng. Dưới đây là một ví dụ về việc sử dụng hợp lý goto:

// Neccessary files and function
void main()
{
	if(!openDataFile())
		goto quit;

	if(!getDataFromFile())
		goto closeFileAndQuit;

	if(!allocateSomeResources())
		goto releaseResourcesAndQuit;

	// Do more work here....

releaseResourcesAndQuit:
	// Release resources
closeFileAndQuit :
	// Close file
quit :
	 // Quit!
}
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024