2010-12-31 39 views
6

Giả sử tôi viết char c[99] = {'Stack Overflow'}; bằng C hoặc C++. Nó biên dịch tốt nhưng điều này có hợp lệ không? Bởi hợp lệ tôi có nghĩa là không gọi bất kỳ loại hành vi không xác định hoặc không xác định.Đây có phải là câu lệnh C hợp lệ không?

Một lần nữa nếu tôi viết char c[99] = 'Stack Overflow'; gcc than phiền về hằng số multicharacter hiển nhiên nhưng ở trên khi tôi kèm theo trình biên dịch dấu ngoặc nhọn thì rất vui! Tại sao nó như vậy?

Tôi cũng lưu ý rằng puts(c); sau câu lệnh đầu tiên sẽ xuất 'w' chính xác ký tự cuối cùng của chuỗi chung tại chỗ Stack Overflow. Tại sao như vậy?

Ai đó có thể giải thích những hành vi này một cách riêng biệt?

+3

Biên dịch và tìm hiểu. – Falmarri

+5

Anh ấy đã nói anh ấy đã biên dịch nó ... – indiv

+22

@Falmarri: Tôi nghĩ bạn giành được giải thưởng RTFQ. Ông nói "nó biên dịch tốt" và cũng mô tả đầu ra, rõ ràng là ông đã kiểm tra nó. Tuy nhiên, thử nghiệm không cho bạn biết liệu thiết bị đó có được định dạng di động hay được xác định rõ ràng theo tiêu chuẩn hay không. –

Trả lời

14

Cả hai chỉ là một chữ, vì vậy, c[0] được đặt thành chữ và c[1] ... c[98] được điền bằng không (ký tự NUL).

Tôi nghĩ giá trị thực sự bị nhét vào c[0] phụ thuộc vào việc triển khai thực hiện, nhưng ít nhất phải biên dịch trên bất kỳ trình biên dịch phù hợp nào.

EDIT: đã xác minh chống lại tiêu chuẩn, trong C++ 0x ít nhất:

Một literal multicharacter có kiểu int và giá trị thực hiện xác định.

Và trong C99 (sử dụng the draft, vì nó hoàn toàn miễn phí):

Giá trị của một hằng số nhân vật số nguyên chứa nhiều hơn một ký tự (ví dụ, 'ab'), hoặc có chứa một nhân vật hoặc thoát khỏi chuỗi không ánh xạ tới một ký tự thực thi một byte, được triển khai thực hiện.

+1

+1 Chào mừng bạn đến với thế giới của nhiều chữ chracter. –

+0

Hm nhưng tại sao câu lệnh với dấu ngoặc nhọn vượt qua kiểm tra cú pháp của trình biên dịch? – Quixotic

+1

@Philando: Bởi vì nó là một " Không có quy tắc nào mà bộ khởi tạo phức hợp phải có nhiều hơn một phần tử, trong thực tế những thứ như 'int a [10] = {0};' rất phổ biến. –

1

Đồng ý - trong Windows Mã lõi - bạn thấy rất nhiều bộ nhớ gắn thẻ. Và nó thực sự được triển khai trên mỗi nền tảng. Tuy nhiên, họ sử dụng ULONG để gắn thẻ bộ nhớ, và nó luôn luôn là một chữ 4 chữ theo thứ tự ngược lại: ULONG tagMemory = 'kscf';

Cách diễn giải là nền tảng cụ thể, nhưng một luồng ký tự.

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