2013-08-16 30 views
5

C++, C#, C, D, Java, ... không dựa.Tại sao chỉ mục mảng là 0 dựa trên hầu hết các ngôn ngữ lập trình?

Matlab là ngôn ngữ duy nhất mà tôi biết rằng bắt đầu từ 1.

+2

Xem http://programmers.stackexchange.com/q/110804/7043 (thật đáng buồn, không thể đóng như trùng lặp - di chuyển nó đến programmers.SE và sau đó đóng nó có vẻ ngớ ngẩn). – delnan

+0

Matlab không phải là duy nhất. Fortran là một ví dụ tốt về lập chỉ mục dựa trên 1. Tôi nghĩ rằng lập chỉ mục dựa trên 0 là tốt hơn cho lập trình chung, trong khi lập chỉ mục dựa trên 1 là tự nhiên hơn cho toán học. – German

Trả lời

0

Tôi đoán nó gần như là lý do lịch sử, ngôn ngữ mới chỉ cố gắng sử dụng các quy ước đang tồn tại mà các lập trình viên đã quen thuộc với.

Ngôn ngữ cũ mà quy tắc này có nguồn gốc gần với kim loại và chỉ mục thực sự là khoảng cách so với phần tử bắt đầu, do đó, 0 có ý nghĩa đối với phần tử đầu tiên.

5

Mảng không bằng c và C++ làm đại diện cho độ lệch từ đầu danh sách mục.

Hai dòng này có kết quả giống nhau trong c.

anArray[3] = 4; 
*(anArray +3) = 4; 

Đầu tiên là chỉ mục chuẩn thứ hai lấy con trỏ thêm ba vào id và sau đó hủy đăng ký lại. Đó là giống như chỉ mục.

+0

Nó sẽ thêm '3 * sizeof (int)' giả định đây là một mảng 'int'. Đây là số học con trỏ. – dramzy

1

Tôi đoán vì mảng sử dụng số học con trỏ để chỉ một số giá trị. Về cơ bản mảng có bộ nhớ tiếp giáp và nếu bạn muốn tham chiếu đến phần tử thứ 5 (a [4]) thì kích thước + 4 * của int được thực hiện

Giả sử nếu bạn bắt đầu bằng 1 thì hãy tham khảo phần tử thứ 5 bạn sẽ phải làm điều gì đó giống như kích thước + (5-1) * của int

0

Có thể "C" đã nhận được vì nó hiệu quả hơn. Để tính địa chỉ của mục trong mảng dựa trên 0, nó đủ cho nhiều chỉ mục theo ItemSize, cho mảng dựa trên 1 bạn phải tính toán (Index-1) * ItemSize. "C" và sau đó "C++", nơi hầu hết các ngôn ngữ phổ biến, vì vậy các ngôn ngữ mới phải tuân theo các quy tắc tương tự, nó giúp tránh những sai lầm cho những người sử dụng C/C++. Nhưng câu hỏi này có vẻ không phù hợp và tôi đoán nó sẽ bị đóng bởi người kiểm duyệt.

P.S. Trong chuỗi Delphi/Pascal là 1 dựa trên, nhưng đối với mảng bạn phải cung cấp phạm vi và vì vậy bạn có thể sử dụng những gì bạn thích.

2

Vâng, hãy xem xét bài viết nổi tiếng của Dijkstra, Why numbering should start at zero. Ông lập luận rằng việc đánh số sẽ bắt đầu bằng 0 vì nó có nghĩa là các chỉ mục hợp lệ thành một mảng có thể được mô tả là 0 <= i < N. Điều này rõ ràng hấp dẫn hơn 1 <= i < N + 1, ở cấp độ thẩm mỹ.

(Người ta có thể hỏi, "tại sao không nói 0 < i <= N", nhưng ông lập luận chống lại điều đó, quá, một lần nữa vì lý do thẩm mỹ.)

+1

Đối số đó giảm một chút bằng phẳng khi bạn xem xét '1 <= i <= N' - thậm chí còn hấp dẫn hơn ở cấp độ thẩm mỹ, khiến cho ngay cả các toán tử quan hệ cũng khớp nhau. :) – cHao

+1

@cHao: đó là lựa chọn tồi tệ nhất của tất cả, bởi vì nó có nghĩa là nếu bạn trừ hai điểm cuối, bạn không còn nhận được độ dài của mảng. Nó thực sự là nguyên nhân của lỗi trong các ngôn ngữ có chức năng cắt mảng được bao gồm ở cả hai đầu. –

+0

Eh.Tôi thường thích '(bắt đầu, chiều dài)' bản thân mình. Bạn không thường xuyên muốn "các mặt hàng X thông qua X + N-1" hoặc bất cứ điều gì như thế; bạn muốn "N mục bắt đầu từ chỉ mục X". Và với điều đó, đối số chiều dài tất cả nhưng biến mất; gần như mọi ngôn ngữ tự tôn trọng những ngày này có mảng biết chiều dài của chúng. – cHao

0

Bởi vì có 10 số nguyên 0..9

Các vấn đề liên quan