0 ondalık değişmez mi yoksa sekizlik değişmez mi?


329

Sıfır her zaman sıfırdır, bu yüzden önemli değil. Ancak bir arkadaşıyla yakın zamanda yapılan bir tartışmada, sekizli değişmezlerin bugün neredeyse kullanılmadığını söyledi. Sonra aslında neredeyse o doğdu içime tüm benim kodda tamsayı değişmezleri vardır yani sekizli 0.

0bir sekizlik düz C ++ dilbilgisi göre? Standart ne diyor?

† Fark ettiğim tek gerçek kullanım, unix dosya izinleri içindir.


6
Bu Java için de geçerli mi?
Philippe

80
Tamamen alakasız bir soru sormak ve tonlarca upvotes almak için +1
Kerrek SB

64
Ben SO anında temsilcisi yolunun derin bir soru değil, cevabı su soğutucu geek kredi inecek tuhaf bir soru olduğunu düşünüyorum :)
Josh

4
Müthiş bir soru :) Ben Java Dil Spec baktım ve Java ondalık. Spesifikasyon bile aşağıdaki alıntıyı içerir: Sekizli rakamların her zaman iki veya daha fazla rakamdan oluştuğunu unutmayın; 0 her zaman ondalık sayı olarak kabul edilir - pratikte çok önemli olduğu için değil, 0, 00 ve 0x0 sayılarının hepsi aynı tamsayı değerini temsil eder.
Tobias Ritzau

14
"Evet, 0 ondalık bir değişmez sayı veya sekizlik bir sayıdır."
Keith Thompson

Yanıtlar:


296

Evet, C ++ 0bir Octal değişmezidir .

C ++ Standardına göre:

2.14.2 Tamsayı değişmez değerler [lex.icon]

integer-literal:  
    decimal-literal integer-suffixopt  
    octal-literal integer-suffixopt  
    hexadecimal-literal integer-suffixopt  
decimal-literal:  
    nonzero-digit  
    decimal-literal digit  
octal-literal:  
    0                           <--------------------<Here>
    octal-literal octal-digit

39
Bir varlık diğer önemli nokta ondalık-değişmezi bir olan sıfırdan farklı basamaklı sıfır veya daha fazla takip rakam belirsizlik yoktur bu yüzden.
CB Bailey

3
@MSalters: Sürümünüzle birlikte, tercihi belirtmeniz gerekir: Bayt deseninin her ikisi de octal-literal ve decimal-literalolası yorumlarıysa, seçin octal-literal. Resmi standardın ifadesinde bu sorun yoktur.
Martin Sojka

23
@MSalters: Herhangi bir sayı basamağı olarak ondalık değişmez değere sahip olamazsınız, tek bir sıfır veya sıfır olmayan bir basamak ve ardından herhangi bir basamak olması gerekir, aksi takdirde her sekizlik değişmez sayı ondalık değişmez olarak yorumlanabilir. Şimdi, derleme hatası görebilirsiniz: ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate.
CB Bailey

3
@ MSalters Örneğin, 0123 hem sekizli-hem de ondalık-literal ile eşleşir, ancak her iki şekilde de farklı anlamlara gelir.
kabarık

5
@CharlesBailey - FTFY, 1hala sekizli ve hepsi var; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
twalberg

44

Ön ekli herhangi bir tam sayı değeri 0sekizlik bir değerdir. Yani: 01 sekizli 1, 010 sekizli 10, ondalık 8 ve 0 sekizli 0 (ondalık ve diğer 0).

Evet, '0' bir sekizli.

Bu, @ Als'in cevabındaki dilbilgisi snippet'inin basit İngilizce çevirisidir :-)


Bir tamsayı öneki 0xolan değil öneki 0. 0xaçıkça farklı bir önektir. Görünüşe göre bu ayrımı yapamayan insanlar var.

Aynı standarda göre, devam edersek:

 integer-literal:
     decimal-literal integer-suffixopt
     octal-literal integer-suffixopt
     hexadecimal-literal integer-suffixopt
 decimal-literal:
     nonzero-digit                       <<<---- That's the case of no prefix.
     decimal-literal digit-separatoropt digit
 octal-literal:
     0                                    <<<---- '0' prefix defined here.
     octal-literal digit-separatoropt octal-digit <<<---- No 'x' or 'X' is
                                                          allowed here.
 hexadecimal-literal:
     0x hexadecimal-digit                 <<<---- '0x' prefix defined here
     0X hexadecimal-digit                 <<<---- And here.
     hexadecimal-literal digit-separatoropt hexadecimal-digit

5
Msgstr "'0' ile başlayan herhangi bir tam sayı sekizlik değerdir." Doğru değil. Örnek: 0xA '0' ile başlar ve bir tamsayı değeridir.
Nikolai Ruhe

4
0xbir jeton değildir. İle başlayan bir tamsayı değişmez 0xdeğeri tek bir simgedir.
Keith Thompson

4
Bu tanım için hangi kaynaktan alıntı yapıyorsunuz? "Jeton" kelimesi , C (N1570 6.4) ve C ++ (C ++ 11 2.7 [lex.token]) standartları tarafından sözdizimsel olarak tanımlanır . 0xhak kazanmaz. (En azından C'de, onaltılı sabitin bir parçası değilse, ancak bu bir belirteç değilse , bir ön işleme numarasıdır (N1570 6.4.8).)
Keith Thompson

11
C ve C ++ standartlarında tanımlanan tamsayı sabitlerinin / değişmezlerinin sözdizimini tartışıyoruz . Standartların "jeton" tanımı nasıl bu bağlamda kullanılacak en uygun değil? Hakaret suçunuz uygun değil. Ve cevabınızdaki teknik bir hata olduğunu düşündüğüm bir şeye işaret ettiğim için bir zorba olduğumu düşünüyorsanız, bu kelimenin anlamını yeniden düşünmenizi öneririz. (
Keith Thompson

4
Merak eden biri varsa, " Simge, bir grup olarak önemli olan bir veya daha fazla karakterden oluşan bir dizedir. " İfadesinin bu Wikipedia makalesinde olduğu anlaşılıyor .
Keith Thompson

-2

Görünüşe göre sıfır ile başlayan tam sayı değişmezleri aslında sekizli. Bu, 0 da içerdiği anlamına gelir. Sıfır sıfır olduğu için bu çok az fark yaratır. Ama bu gerçeği bilmemek size zarar verebilir.

İkili sayıları ondalık ve onaltılık çıktıya dönüştürmek için bir program yazmaya çalışırken bunu fark ettim. Her sıfır ile başlayan bir sayı veriyordum yanlış çıktı alıyordum (örneğin, 012 = 10, 12 değil).

Aynı hatayı yapmamanız için bu bilgiyi bilmek iyidir.


7
Sıfır ile başlayan ancak sıfırdan sonra 'x' olmadan tamsayı değişmez değerleri.
luiscubal

5
Kanıtsız "evet" iddiası da bir cevap değildir.
Orbit'te Hafiflik Yarışları

1
Bu mantıkla, 09 sekizli bir sayıdır.
0xc0de

3
@ 0xc0de: Hayır, 09bir sekizli sayı değildir, çünkü bu bir sayı değildir; herhangi bir tamsayı değişmezinin sözdizimiyle eşleşmez.
Keith Thompson

7
Ben 0xc0de @ oldukça eminim bilir o 09bir sekizlik sayı değil. Ne söyleniyordu "oldu bu mantıkla , 09bir sekizlik sayıdır." Çünkü çıkarım, yani 09bir değil bir sekizlik sayı mantığı yanlış olmalı.
TRiG
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.