Đánh số tháng dựa trên 0 [đã đóng]


98

Một số ngôn ngữ lập trình phổ biến sử dụng số tháng bị tắt bởi 1 - JavaScript được nghĩ đến, cũng như Java và nếu bộ nhớ phục vụ, C là một thứ khác. Tôi có một số câu hỏi:

  • Nếu bạn định bỏ qua việc đánh số tháng được sử dụng bởi giáo dân, vậy tại sao không vì lợi ích nhất quán mà cũng bỏ qua việc đánh số ngày được sử dụng bởi giáo dân và đánh số ngày trong mỗi tháng bắt đầu từ 0?
  • Tại sao điều này rất phổ biến?
  • Ý tưởng này là của ai ngay từ đầu?

Mảng, bắt đầu từ 0 và mọi người đề cập đến ngày bằng số?
glasnt 21/09/09

13
@TomatoSandwich: mọi người thường đề cập đến các tháng bằng các con số và họ đánh số chúng bắt đầu từ 1 .
Robert L

2
Nhân tiện, lập trình viên API không phải là thượng đế; đôi khi lỗi mắc phải trong việc triển khai; chỉ cần đối phó với nó. Không phải đây chính xác là một trường hợp (bạn thậm chí không nói ngôn ngữ nào), nhưng đừng mong đợi mọi thứ đều hoàn hảo. Tôi ngưỡng mộ muốn biết lý do.
Noon Silk

5
Ở Nhật, họ chỉ sử dụng số. Họ không sử dụng tháng Giêng, tháng Hai, v.v. Thế giới phương Tây cũng sử dụng các con số rất thường xuyên. Tôi hy vọng họ không bao giờ tạo ra một ngôn ngữ lập trình khác chọn kiểu mảng thay cho kiểu ngôn ngữ nói nữa. Đó là một bản sửa lỗi đơn giản cho một thứ sẽ được sử dụng hàng triệu lần.
Wolfpack'08

1
Đồng ý, mặc dù không phải là tội treo cổ, nhưng ai đã làm điều này chỉ lãng phí mười phút thời gian của tôi và xứng đáng bị tát bằng một con cá ướt cỡ vừa.
James McCormack

Câu trả lời:


53

Việc sử dụng số 0 để bắt đầu đếm thực sự là một thủ thuật tối ưu hóa của các lập trình viên Assembly. Thay vì gán 1 cho thanh ghi đếm, họ XOR thanh ghi với chính nó, nó nhanh hơn một chút trong các chu kỳ CPU. Điều này có nghĩa là việc đếm sẽ bắt đầu bằng 0 và sẽ luôn bằng chiều dài của các phần tử, không bao gồm phần tử cuối cùng.

Ngoài ra, việc sử dụng số 0 cũng phổ biến với số học con trỏ trong đó bạn sẽ sử dụng một con trỏ cơ sở trỏ vào một số bộ nhớ được cấp phát, cộng với một con trỏ thứ hai sẽ nằm ở khoảng lệch so với con trỏ cơ sở này. Ở đây, việc sử dụng giá trị 0 rất có ý nghĩa để trỏ offset đến cơ sở của khối bộ nhớ. (Lôgic mảng chung có xu hướng là địa chỉ cơ sở cộng với kích thước bản ghi offset x.)

Và số tháng dựa trên số không? Thông thường, nhiều môi trường lập trình tính toán dữ liệu là một số ngày kể từ một số dữ liệu mặc định. Ngày 31 tháng 12 năm 1899 là một ngày phổ biến, mặc dù đã có rất nhiều ngày khác được sử dụng làm ngày gốc. Tất cả các ngày khác được bù trừ từ cơ sở này và sẽ chỉ được lưu trữ dưới dạng một số duy nhất. Phân số sẽ được sử dụng để chỉ giờ, phút và giây, trong đó 0,25 sẽ là 24/4 = 6 giờ. Vì vậy, để chuyển đổi một ngày thành một ngày thực, tất cả những gì môi trường phải làm là chuyển đổi số này thành một ngày thực.

Tuy nhiên, sự kết hợp của mảng dựa trên 0 và giá trị tháng dựa trên 1 thực sự gây ra một vấn đề. Để có tên tháng của tháng 9, bạn sẽ phải lấy mục 8 từ mảng tháng. Một số nhà phát triển sẽ hài lòng với việc giảm số tháng trước khi nhận được tên của nó. Những người khác thích thay đổi tháng thành một cái gì đó dựa trên số 0 vì mọi người chỉ muốn biết tên chứ không phải số. Đó là một quan điểm cá nhân.


92
Các hàm tạo Ngày của JavaScript và AS3 nhận các giá trị thực cho mọi thứ "ngoại trừ" tháng, vì một lý do không xác định phải được chỉ định là dựa trên 0. Đó chắc chắn là một thiết kế API khủng khiếp.
Triynko

3
Tôi đồng ý. Điều này chỉ khiến tôi mất một giờ để cố gắng tìm ra lý do tại sao ngày của tôi lại cách một tháng. Nó không thực sự có ý nghĩa nhiều nếu mọi thứ đều dựa trên 1 ngoại trừ tháng. Thật không may, nó có thể không thể sửa chữa được, nếu không chúng tôi sẽ kết thúc với một vấn đề Y2K khác :-).
vàng mike

1
Tl; dr: Bởi vì sự tra cứu mảng monthName[monthNumber]hoặc mon_name[tm_mon]với ký hiệu time.h .
Perseids

XOR-với-chính nó là một chút của một con cá trích đỏ; đó là một thứ của Intel. Các MPU khác có những cách khác để không đăng ký; một số cũng có cách hiệu quả để đặt chúng thành 1. Lý do chính cho những thứ dựa trên số 0 là tính toán chỉ số; đôi khi chúng cũng hữu ích cho số học.
alastair

6

Nó là như thế nào và trọng lượng lớn của phần mềm được xây dựng dựa trên giả định đó có nghĩa là nó sẽ tồn tại trong một thời gian.

Ý kiến của tôi là đó là lỗi của C, và tất cả những ngôn ngữ khác của Johnie-come-gần đây đều tuân theo nó.

Bạn nhận được một số tình huống hài hước từ những người không biết rõ hơn. Một trong số ít lỗi Y2K mà nhóm của chúng tôi tìm thấy là một trang web tự hào tuyên bố năm là 19100 đơn giản vì họ bắt đầu struct tmnăm bằng chữ "19".


Ít nhất một người (không phải tôi) đã xác định các hàm "getRealMonth" và "setRealMonth" để sử dụng trong các tập lệnh của anh ấy. Tôi không trách anh ta một chút nào.
Robert L

1
Ủng hộ cho tài liệu tham khảo về lỗi Y2K.
Justus Romijn

4

Đúng, người La Mã cũng gặp vấn đề với con số 0.

Đây chỉ là một hệ quả [không trực quan] của toán học (là một thành phần mạnh mẽ của lập trình, đặc biệt là lập trình sơ khai) xác định số 0 là số tự nhiên đầu tiên (thuật ngữ có vấn đề mà một) thực, dương * và vì một mảng được lập chỉ mục với số thực , các số tự nhiên phần tử "đầu tiên" ở chỉ số 0.

Tháng thực sự là các giá trị được đặt tên trong một mảng, trong đó ngày và năm là các giá trị được đánh số - có lẽ sẽ hữu ích hơn khi coi ngày / năm nằm trong các mảng trông giống như {"1", "2", "3" ,. .. } chúng tôi.

Vì sao điều này rất phổ biến (ngoài việc chính xác về mặt toán học) thì tất cả các ngôn ngữ bạn liệt kê đều có nguồn gốc chung vì một điều ...

Biên tập:

Nhìn sâu hơn vào nó, liên kết wikipedia này nêu chi tiết một số lý do tốt và thú vị cho việc lập chỉ mục bằng không (không trực tiếp nói lên lý do tại sao các tháng không được lập chỉ mục nhưng tôi nghĩ điều đó đã được đề cập), và liên kết SO này đã trả lời câu hỏi trước đây.

Có vẻ như quan điểm phổ biến là "tai nạn lịch sử" hoặc "vì tháng không phải là con số nên không thể so sánh với lưu trữ ngày / năm" tùy thuộc vào người bạn yêu cầu.

* Xin lỗi, xin lỗi, vật lý! = Toán học quay lại cắn tôi ở đó. Tắt bàn tay tôi bây giờ.


5
Số 0 không phải là một số dương. Nó cũng không phải là một số âm.
Robert L

Điểm tốt, có lẽ bạn nên đổi nó thành "số tự nhiên".
paxdiablo 21/09/09

1
Thật thú vị, tôi luôn nghĩ rằng mảng C bắt đầu từ 0 để đơn giản hóa số học con trỏ: a[0]== *(a + 0).
quá nhiều php

2
Trên thực tế, trong máy tính, bạn có thể có số 0 âm và dương nếu bạn sử dụng hệ thống bổ sung của Ones. May mắn thay, hệ thống đó hầu như không bao giờ được sử dụng nữa. Xem en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink 22/09/09

Tháng cũng là một con số, cũng giống như ngày trong văn hóa của chúng ta. Tháng đầu tiên trong năm thực sự được gọi là "1 (st) tháng" và tháng cuối cùng được gọi là "12 (th) tháng"
Michael Tsang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.