2016-08-15 18 views
5

Gần đây, tôi đã xem chi tiết về các chữ trong ngôn ngữ lập trình D.Tại sao int x = 08; là hợp lệ khi int x = 078; không hợp lệ trong 'DMD`?

octal literals sử dụng 0 làm tiền tố cho các số, int x = 078; không hợp lệ một cách tự nhiên. Nhưng tại sao int x = 08; hợp lệ trong DMD?

Tuy nhiên, tôi đã thử nghiệm tương tự với GCC (trình biên dịch C) để thấy rằng cả hai đều không hợp lệ.

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; 
} 

Đây có phải là lỗi trong DMD? Cảm ơn trước.

N.B. Tôi đang sử dụng DMD32 D Compiler v2.071.2-b2 (phiên bản Win32).

+1

Theo một bình luận trên http://programmers.stackexchange.com/a/221800/153446 Ken Thompson cố ý làm 08 và 09 làm việc tại B: Trích dẫn từ phần B của Thompson B 4.1 Biểu thức chính: "Hằng số bát phân giống với hằng số thập phân ngoại trừ nó bắt đầu bằng số không. Sau đó nó được diễn giải trong cơ sở 8. Lưu ý rằng 09 (cơ số 8) là hợp lệ và bằng 011 Một hằng số ký tự được biểu thị bằng 'theo sau bởi một hoặc hai ký tự (có thể được thoát) theo sau bởi một ký tự khác'. Nó có giá trị bằng với giá trị của các ký tự được đóng gói và được điều chỉnh đúng. " –

+0

Chỉ nghĩ rằng đó là mã hoặc dự định đọc như văn bản đơn cách nên được ra trong khối mã, không phải tên của sự vật. –

Trả lời

3

Chữ số thập phân là deprecated in D và sẽ bị lỗi nếu sử dụng. Thực tế là dmd chấp nhận 08 là dấu hiệu của lỗi. Nếu bạn muốn sử dụng octals, sau đó sử dụng mẫu std.conv.octal

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

Nó không thể là một lỗi nếu nó không phải trên Bugzilla! Tôi nhanh chóng điền vào (https://issues.dlang.org/show_bug.cgi?id=16396). – greenify

Các vấn đề liên quan