2016-08-15 19 views
5

Niedawno sprawdzałem szczegóły literałów w języku programowania D.Dlaczego int x = 08; jest ważne, gdy int x = 078; jest nieprawidłowy w `DMD`?

Ponieważ ósemkowe literały używają 0 jako prefiksu do numerów, int x = 078; jest nieprawidłowy w sposób naturalny. Ale dlaczego int x = 08; jest ważny w DMD?

Jednak testowałem to samo z GCC (kompilator C), aby stwierdzić, że oba są nieprawidłowe.

import std.stdio; 

int main(string[] args) 
{ 
    // int x = 078; // error here: radix 8 digit expected, not '8' 
    int x = 08; // but no error here 
    writeln("x = ", x); 
    return 0; 
} 

Jest to błąd w DMD? Z góry dzięki.

N.B. Korzystam z wersji DMD32 D Compiler v2.071.2-b2 (wersja Win32).

+1

Według komentarzu http://programmers.stackexchange.com/a/221800/153446 Ken Thompson celowo wykonane 08 i 09 prac w B: Cytat z podręcznika Thompsona B Manual 4.1 Wyrażenia pierwotne: "Stała ósemkowa jest taka sama jak stała dziesiętna, z tą różnicą, że zaczyna się od zera, a następnie interpretowana w bazie 8. Pamiętaj, że 09 (podstawa 8) jest legalna i równa 011 Stała znakowa jest reprezentowana przez ", po której następuje jeden lub dwa znaki (ewentualnie znak" escaped "), po którym następuje inny znak". Ma on wartość równą wartości znaków spakowanych i skorygowanych w prawo. " –

+0

Uważa się, że jest to kod lub ma być odczytany jako tekst o stałej szerokości powinien znajdować się w blokach kodu, a nie w nazwach rzeczy. –

Odpowiedz

3

Cyfry ośmiorzędne to deprecated in D i powinny zostać usunięte, jeśli są używane. Fakt, że dmd akceptuje 08, wskazuje na błąd. Jeśli chcesz korzystać octals, a następnie użyć szablonu std.conv.octal

void main() 
{ 
    import std.conv : octal; 
    //int a = octal!8; //Error 
    int b = octal!7; //Fine 
} 
+2

Nie może to być błąd, jeśli nie ma go w Bugzilli! Szybko [wypełnione] (https://issues.dlang.org/show_bug.cgi?id=16396) to. – greenify

Powiązane problemy