Bước tới nội dung

Lỗi Off-by-one

Bách khoa toàn thư mở Wikipedia

Lỗi off-by-one (off-by-one error (OBOE)) là một lỗi logic thường gặp trong quá trình viết mã (coding) của lập trình viên máy tính. Đây được xem là một trong những lỗi phổ biến nhất trong lĩnh vực lập trình, và nó thường xuất hiện khi hiện thực một vòng lặp (như for, while, hay repeat... tùy ngôn ngữ) trong đó người lập trình mắc lỗi khi xét đến giá trị bắt đầu khi thực hiện là 0 hay 1 hoặc sai sót khi sử dụng dấu ≤ (nhỏ hơn hoặc bằng) hay < (nhỏ hơn) trong so sánh giá trị kết thúc.

Lỗi này cũng xuất hiện trong toán học.

Ví dụ trong lập trình

[sửa | sửa mã nguồn]

Xét một dãy các giá trị hay mảng (array) gồm có n phần tử và một vòng lặp for duyệt qua mảng này như sau:

- Bắt đầu bằng 0: khi này, phép toán so sánh để kết thúc vòng lặp phải là <

    for (i = 0; i < 5; i++) {
        /* mã chương trình */
    }

- Bắt đầu bằng 1: phép toán so sánh là ≤'

    for (i = 1; i <= 5; i++) {
        /* mã chương trình */
    }

Ví dụ tương tự đối với trường hợp duyệt ngược, bắt đầu là n hoặc n-1, và cũng tương tự với các vòng lặp khác.

Ví dụ trong toán học

[sửa | sửa mã nguồn]
Một hàng rào thẳng có n khoảng cần n+1 cái cọc

Những bài toán điển hình về lỗi này là phép đếm, ví dụ như bài toán về cọc hàng rào. Có thể mô tả bài toán này như sau: "Giả sử cần cắm một số lượng cọc theo đường thẳng để xây dựng một hàng rào dài 100m, với mỗi 10m sẽ cắm một cây cọc. Hỏi cần bao nhiêu cọc để hoàn thành?"

Ở đây, ta xét đến cắm luôn cọc cả hai đầu hàng rào, như vậy đáp án sẽ là 100/10 + 1 = 11 cây cọc. 100/10 chỉ là số khoảng cần thiết để lấp đủ hàng rào mà thôi.

Tham khảo

[sửa | sửa mã nguồn]