Lệnh goto trong C++

Cho em hỏi các tiền bối có ai sử dụng lệnh goto trong lúc lập trình không, do em nghe thầy bảo là lệnh goto dễ gây lỗi nên không được sử dụng nữa.

Một số trường hợp chỉ cần dùng break; (ra khỏi vòng lặp) hay continue; (nhảy lên 1 bước nữa) là đủ xài. Căng hơn thì try… catch… :slight_smile:

2 Likes

Hi Le Ly Vinh.
Nếu bạn code một lần sau đó bỏ không đọc lại nữa thì dùng không vấn đề gì. Tuy nhiên nếu cấn đọc lại code thì sẽ làm khó người đọc.

1 Like

Sức mạnh càng cao, trách nhiệm càng lớn. Cứ nhớ thế cho mình khi bạn dùng goto.

2 Likes

Trong C++ có RAII rồi nên ít khi bạn dùng.
Tuy nhiên, trong C có 1 trường hợp dùng goto dùng để clean up (giải phóng memory, resource, connection), hoặc trả về status (success, error code)

static _buffer_info_t*
_buffer_info_new(PyObject *obj)
{
    ...

    info = malloc(sizeof(_buffer_info_t));
    if (info == NULL) {
        PyErr_NoMemory();
        goto fail;
    }

    ...

    err = _buffer_format_string(descr, &fmt, obj, NULL, NULL);
    Py_DECREF(descr);
    if (err != 0) {
        free(fmt.s);
        goto fail;
    }

    ...

fail:
    free(info);
    return NULL;
}

Trong các ngôn ngữ mới thì họ giải quyết cách này bằng keyword defer. (Go, Swift)


Tham khảo: https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/buffer.c

2 Likes

Mình toàn coi mặc định goto là lệnh cấm sử dụng :grinning::grinning: Không phải vì khó sử dụng mà nó phá vỡ tính tuần tự của chương trình :smile::smile:

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