web-dev-qa-db-ja.com

ゼロベースの月番号

人気のあるプログラミング言語の中には、1ずつずれた月の番号を使用するものがあります。Javaと同様にJavaScriptが頭に浮かび、メモリが提供される場合はCも別のものです。いくつか質問があります:

  • 素人が使用する月の番号付けを無視する場合、一貫性のために素人が使用するdayの番号付けを無視し、各月の日を0から数えますか?
  • なぜこれが一般的ですか?
  • そもそもこれは誰の考えですか?
96
Robert L

ゼロを使​​用してカウントを開始することは、実際にはアセンブリプログラマーによる最適化の秘isです。カウントレジスタに1を割り当てる代わりに、レジスタをそれ自体とXORしました。これはCPUサイクルでわずかに高速でした。つまり、カウントは0から始まり、最後の要素を除いて、常に要素の長さまでです。

また、ゼロの使用は、割り当てられたメモリを指す1つのベースポインターと、このベースポインターからのオフセットにある2つ目のポインターを使用するポインター演算でも一般的です。ここで、値ゼロを使用すると、オフセットをメモリブロックのベースに向けることができます。 (一般的な配列ロジックは、ベースアドレスにオフセットxレコードサイズを加えたものになる傾向があります。)

そして、ゼロベースの月数?多くの場合、多くのプログラミング環境では、一部のデフォルトデータからの日数としてデータを計算します。 1899年12月31日が一般的な日付ですが、基準日として使用される他の日付がたくさんあります。他のすべての日付は、この基準からオフセットされており、1つの単一の数値として保存されるだけです。分数は、時、分、秒を示すために使用され、0.25は24/4 = 6時間になります。したがって、日付を実際の日付に変換するには、この数値を実際の日付に変換するだけです。

ただし、ゼロベースの配列と1ベースの月の値の組み合わせには問題があります。月9の月名を取得するには、月配列から項目8を取得する必要があります。一部の開発者は、名前を取得する前に月数を減らすことに満足しています。他の人は、数字ではなく名前だけを知りたいので、月をゼロベースの何かに変更することを好みました。それは個人的な見解です。

52
Wim ten Brink

それはそれであり、その仮定に基づいて構築されたソフトウェアの巨大な重みは、しばらくの間存在することを意味します。

私の意見は、それがCのせいであり、他のすべてのJohnie-come-lately言語がちょうどそれに準拠したということです。

よく知らない人から面白い状況が得られます。私たちのチームが発見した数少ないY2Kバグの1つは、struct tm年とリテラル「19」。

6
paxdiablo

はい、ローマ人にもゼロの問題がありました。

これは ただ ゼロ(最初の(問題の用語))を実数として定義する数学(プログラミングの強力なコンポーネント、特に初期プログラミング)の[直感的ではない]結果、 ポジティブ*自然数。配列には実数の自然数でインデックスが付けられるため、「最初の」要素のインデックスは0です。

月は実際には配列の名前付きの値であり、日と年は値が付けられます-日/年を{"1"、 "2"、 "3"、のように見える配列にあると考える方がおそらく便利です。 ..}自身。

なぜこれが非常に一般的であるか(数学的に正しいことは別として)をリストしたすべての言語は、1つの点で共通のOriginから派生しています...

編集:

さらに詳しく見ると、これは wikipedia リンクがゼロインデックス付けのいくつかの良い理由を詳しく説明しています(これは、なぜ月がゼロインデックス付けされるのか直接話さないが、すでにカバーされていると思います)、そして [〜#〜] so [〜#〜] リンクは前に質問に回答しています。

誰が尋ねるかに応じて、一般的な意見は「歴史的事故」または「月は数字ではないので日/年の保管と比較できないため」のいずれかであるように見えます。

*申し訳ありませんが、申し訳ありませんが、物理学!今すぐ私のアイロンをかけましょう

4
annakata