Hỏi về cách thay thế goto trong c

em đọc tài liệu thì thấy bảo không nên dùng goto vì làm rối chương trình. vậy mọi người chỉ em cách thay thế goto bằng cái khác với ạ. ví dụ thay goto trong chương trình dưới đây:

#include<stdio.h>
#include<conio.h>
#include<windows.h>
int main(){
    while(!kbhit()){
        printf("hello world! ");
        Sleep(1000);
    }
    tiep: ;
    char a=getch();
    while (a!='\0')
    {
        if (a=='A') {
            printf("A");goto tiep; 
        }
        else if (a=='B') {
            printf("B");goto tiep; 
        }
        else break;
    }
    return 0;
}

Ở đây bạn chỉ cầcho char a = getch vào trong while và cho while(true) là được

4 Likes

Mọi goto đều thay bằng for hoặc while được.

3 Likes

Nó rối vì chưa hiểu và do đó áp dụng sai chỗ, sai mục đích.
Giờ đoạn code có 10 step. Đang thực thi đến step 4 muốn quay lại step 2 hoặc nhảy thẳng đến step 8 mà không có goto chắc phê vãi lòi.

4 Likes

Các loại vòng lặp đều thay thế lẫn nhau được.

2 Likes
while (true)
{
  char a=getch();
  if (a=='\0') break;
  if (a=='A' || a =='B') printf("%c", a);
  else break;
}

không có chuyện viết kiểu goto lại sáng sủa hơn nhé, phải loại bỏ hoàn toàn bạn, không được dùng

Edit: như các bạn ở dưới nói, goto có thể dùng để thoát khỏi nested loop, là mình kiến thức hạn hẹp cứ nghĩ phải bỏ hoàn toàn

6 Likes

Because they lead to spaghetti code.

In the past programming languages didn’t have while() if() etc, and programmers used goto to make up the logic of their programs. It lead to an unmaintainable mess.

That’s why the CS gods created functions conditionals and loops. Structured programming was a revolution at the time.

goto’s are appropriate in a few places, such as for jumping out of nested loops


Không có chuyện không được dùng nha bạn. Chỉ là nếu lạm dụng quá thì sẽ khiến chương trình của bạn nó dối và khó đọc thôi. Trong một vài trường hợp nếu cần thiết vẫn có thể dùng.

4 Likes

Thế không được dùng thì nó sinh ra goto làm gì vậy ?
Không kiểm soát nổi lại đổ tại ngôn ngữ ?
Thua … :smile:

4 Likes

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Res-goto
Từ cha đẻ của C++

ES.76: Avoid goto

Reason

Readability, avoidance of errors. There are better control structures for humans; goto is for machine generated code.

Exception

Breaking out of a nested loop. In that case, always jump forwards.

for (int i = 0; i < imax; ++i)
    for (int j = 0; j < jmax; ++j) {
        if (a[i][j] > elem_max) goto finished;
        // ...
    }
finished:
// ...
4 Likes

Giống như phát minh ra null là phát minh sai lầm trị giá tỉ đô thôi.

Người ta khuyên không nên dùng bởi vì dùng cái thứ như thế này rất dễ tạo ra code rối như canh hẹ, nhiều khi bị nói quá lên như goto is evil, thật ra nó chỉ là nó, nhưng để dùng được cho hợp lý, nó đòi hỏi quá nhiều trách nhiệm và sự thông minh ở người sử dụng, chưa kể còn để người khác đọc nữa. Nói chung là sức mạnh lớn quá đòi hỏi trách nhiệm quá lớn.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?