Sıfır tabanlı ay numaralandırması [kapalı]


98

Bazı popüler programlama dilleri, 1 ile kapalı olan ay numaralandırmasını kullanır - Java gibi JavaScript akla gelir ve bellek hizmet veriyorsa, C başka bir şeydir. Birkaç sorum var:

  • Eğer sıradan insanlar tarafından kullanılan ay numaralandırmasını göz ardı edecekseniz, neden tutarlılık uğruna, sıradan insanlar tarafından kullanılan gün numaralandırmasını ve 0'dan başlayarak her ayın günlerini numaralandırmayı da ihmal etmeyesiniz?
  • Bu neden bu kadar yaygın?
  • Bu en başta kimin fikriydi?

Diziler, 0'dan başlar ve insanlar günlere sayılarla mı başvurur?
glasnt

13
@TomatoSandwich: oldukça sık insanlara bakın ay sayılarla ve onlar başlayarak sayı onları 1 .
Robert L

2
API Programcıları bu arada tanrı değildir; bazen uygulamalara hatalar girer; sadece onunla ilgilen. Bu tam olarak bir durum değil (hangi dili bile söylemiyorsunuz), ancak her şeyin mükemmel olmasını beklemeyin. Yine de sebebini bilmek istemekten hoşlanıyorum.
Noon Silk

5
Japonya'da sadece sayı kullanırlar. Ocak, Şubat vb. Kullanmazlar. Batı dünyası da sayıları çok sık kullanır. Umarım bir daha asla dizi stilini konuşulan dil stiline tercih eden başka bir programlama dili yapmazlar. Milyonlarca kez kullanılacak bir şey için çok basit bir düzeltme.
Wolfpack'08

1
Kabul edildi, asılı bir suç olmasa da, bunu yapan kişi zamanımın on dakikasını boşa harcadı ve orta boy ıslak bir balıkla tokatlamayı hak ediyor.
James McCormack

Yanıtlar:


53

Saymaya başlamak için sıfırın kullanılması aslında Assembly programcılarından bir optimizasyon hilesi. Sayma yazmacına 1 atamak yerine, kaydı kendisiyle XOR'ladılar, bu CPU çevrimlerinde biraz daha hızlıydı. Bu, saymanın 0 ile başlayacağı ve sonuncusu hariç her zaman elemanların uzunluğuna kadar olacağı anlamına geliyordu.

Ayrıca, sıfır kullanımı, bazı tahsis edilmiş belleğe işaret eden bir temel işaretçi ve bu temel işaretçiden bir ofsette olacak ikinci bir işaretçi kullanacağınız işaretçi aritmetiği ile de popülerdir. Burada, sıfır değerini kullanmak, ofseti bellek bloğunun tabanına işaret etmek çok mantıklıdır. (Genel dizi mantığı, temel adres artı ofset x kayıt boyutu olma eğilimindedir.)

Ve sıfır tabanlı ay numaraları? Çoğu zaman, birçok programlama ortamı verileri bazı varsayılan verilerden bu yana geçen gün sayısı olarak hesaplar. 31 Aralık 1899 popüler bir tarihtir, ancak temel tarih olarak kullanılan birçok başka tarih de vardır. Diğer tüm tarihler bu temelden farklıdır ve sadece tek bir sayı olarak kaydedilecektir. 0,25'in 24/4 = 6 saat olduğu saat, dakika ve saniyeyi belirtmek için kesirler kullanılır. Dolayısıyla bir tarihi gerçek bir tarihe dönüştürmek için ortamın yapması gereken tek şey bu sayıyı gerçek bir tarihe dönüştürmektir.

Bununla birlikte, sıfır tabanlı diziler ve 1 tabanlı ay değerlerinin birleşimi bir sorun yaratır. 9. ayın ay adını almak için, ay dizisinden öğe 8'i almanız gerekir. Bazı geliştiriciler, adını almadan önce ay numarasını düşürmekten mutlu olurlar. Bazıları ise ayı sıfır temelli bir şeye çevirmeyi tercih etti çünkü insanlar numarayı değil sadece adını bilmek istiyorlar. Bu kişisel bir görüş.


92
JavaScript ve AS3 Tarih oluşturucuları, bilinmeyen bir nedenle sıfır tabanlı olarak belirtilmesi gereken ay "hariç" her şey için gerçek değerler alır. Bu tartışmasız korkunç bir API tasarımı.
Triynko

3
Katılıyorum. Randevumun neden bir ay olduğunu anlamaya çalışırken bu bana bir saate mal oldu. Ay hariç her şeyin 1 temelli olması pek mantıklı gelmiyor. Ne yazık ki, muhtemelen düzeltilemez, aksi takdirde başka bir Y2K problemiyle sonuçlanırız :-).
mike gold

1
Tl, dr: için dizi arama, monthName[monthNumber]ya da mon_name[tm_mon]birlikte time.h gösterim .
Perseids

XOR-kendiliğinden olayı biraz kırmızı ringa balığı gibidir; bu bir Intel şey. Diğer MPU'ların kayıtları sıfırlamanın başka yolları vardı; bazılarının da onları 1'e ayarlamak için etkili yolları vardı. Sıfır tabanlı şeylerin ana nedeni indeks hesaplamalarıdır; bazen aritmetik için de faydalıdırlar.
alastair

6

Ne olduğu ve bu varsayıma göre oluşturulan yazılımın muazzam ağırlığı, bir süre daha ortalıkta olacağı anlamına geliyor.

Benim görüş o C hatamdı ve tüm diğer Johnie geç gelen dilleri sadece uyacakları olmasıdır.

Daha iyi bilmeyen insanlardan bazı komik durumlar alıyorsunuz. Ekibimizin bulduğu birkaç Y2K hatasından biri, yılın 19100 olduğunu gururla ilan eden bir web sitesiydi, çünkü struct tmyıla "19" harfi eklediler.


En az bir kişi (ben değil) komut dosyalarında kullanılmak üzere "getRealMonth" ve "setRealMonth" işlevlerini tanımlamıştı. Onu hiç suçlamıyorum.
Robert L

1
Y2K hata referansı için oy verin.
Justus Romijn

4

Evet, Romalıların da sıfır sorunu vardı.

Bu sadece matematiğin [sezgisel olmayan] bir sonucudur (programlamanın güçlü bir bileşeni, özellikle erken programlama) sıfırı ilk (problemli terim olan biri) gerçek, pozitif * doğal sayı olarak tanımlayan ve bir dizi gerçek , doğal sayılar "ilk" eleman 0 dizinindedir.

Aylar, günlerin ve yılların numaralandırılmış değerler olduğu bir dizide gerçekten adlandırılmış değerlerdir - belki de günleri / yılları {"1", "2", "3" gibi görünen diziler olarak düşünmek daha yararlı olabilir. ..} kendileri.

Bunun neden bu kadar yaygın olduğuna gelince (matematiksel olarak doğru olması dışında), listelediğiniz tüm diller bir şeyin ortak bir kökeninden geliyor ...

Düzenle:

Daha derinlemesine bakıldığında, bu wikipedia bağlantısı, sıfır indekslemenin birkaç iyi ve ilginç nedenini ayrıntılarıyla anlatıyor (bu, ayların neden sıfır indekslendiğiyle doğrudan konuşmuyor, ancak bunun zaten kapsandığını düşünüyorum) ve bu SO bağlantısı daha önce soruyu cevapladı.

Görünüşe göre yaygın görüş ya "tarihi kaza" ya da "aylar sayı olmadığı için, bu nedenle gün / yıl depolamayla karşılaştırılamaz", kime sorduğunuza bağlı olarak.

* Üzgünüm, özür dilerim, fizik! = Matematik beni orada ısırmak için geri geliyor. Şimdi ellerimi ütülemeye gidiyorum.


5
Sıfır, pozitif bir sayı değildir. Aynı zamanda negatif bir sayı değildir.
Robert L

İyi bir nokta, belki de "doğal sayı" olarak değiştirmelisiniz.
paxdiablo

1
İlginç, işaretçi aritmetiğini basitleştirmek için C dizilerinin her zaman 0'dan başladığını düşünmüştüm: a[0]== *(a + 0).
çok fazla php

2
Aslında, hesaplamada, Birler'in tamamlayıcı sistemini kullanırsanız, pozitif ve negatif bir sıfıra sahip olabilirsiniz. Neyse ki, bu sistem neredeyse hiç kullanılmıyor. Bkz. En.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink

Ay da kültürümüzde gün gibi bir sayıdır. Bir yılın ilk ayına gerçekten "1 (birinci) ay" denir ve son aya "12 (inci) ay" denir
Michael Tsang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.