2010-09-08 31 views
7

thể trùng lặp:
Why are C character literals ints instead of chars?C và C++ khác biệt trong sizeof ('x')

Tại sao khi sử dụng C không sizeof('x') trở lại 4 nhưng sizeof('x') trong C++ trả 1?

C++ thường cố gắng để không có gì hơn một superset của C vậy tại sao hai kết quả phân kỳ?

Chỉnh sửa Chỉ cần làm rõ thêm. Điều này có vẻ như một động thái có chủ ý trên một phần của ủy ban tiêu chuẩn và tôi cho rằng việc thay đổi kích thước của 'x' sẽ không được thực hiện mà không có lý do chính đáng. Tôi quan tâm đến lý do là gì.

+2

Nhiều hơn hoặc ít hơn một trùng lặp của [Kết quả kích thước khác nhau] (http://stackoverflow.com/questions/49046/different-sizeof-results), [Tại sao chữ C ký tự int thay vì ký tự?] (http://stackoverflow.com/questions/ 433895 /) và [Hiểu sizeof (char) trong trình biên dịch 32 bit C] (http://stackoverflow.com/questions/3451266/) và có lẽ một hoặc hai ot của cô ấy. Tìm thấy với http://stackoverflow.com/search?q=[c]+[c%2B%2B]+sizeof+character+literal. – dmckee

+0

không có bản sao nào giải thích tại sao. – doron

+0

@deus: Đó chỉ là một quyết định thiết kế. Cách "c" có nghĩa là trình biên dịch phải đưa ra quyết định ít hơn về loại khuyến mãi ('gây ra' khuyến mãi 'xảy ra mỗi lần) mà có thể đã phát một cuộn: các máy của những năm đầu bảy mươi chậm và có bộ nhớ hạn chế, vì vậy các trình biên dịch đơn giản là phải. – dmckee

Trả lời

16

Để trích dẫn C++ tiêu chuẩn ISO 14882: 2003, phụ lục C.1.1 khoản 2.13.2

Thay đổi: Loại ký tự chữ được thay đổi từ int để char

: Điều này là cần thiết để cải thiện kiểu đối sánh hàm được nạp chồng. Ví dụ:

int function(int i); 
int function(char c); 
function(’x’); 

Đó là một lợi thế rằng cuộc gọi này phù hợp với phiên bản thứ hai của chức năng chứ không phải là

đầu tiên (phụ lục C mô tả sự không tương thích giữa C và C++)

+0

Nhiều hơn hoặc ít hơn những gì tôi nghĩ nhưng tốt đẹp để xem trong màu đen và trắng. – doron

+0

Tất nhiên, họ * có thể * vừa giới thiệu cú pháp "' char' literal "- ví dụ' C'x'' thuộc kiểu 'char', giống như cách' L'x'' thuộc loại 'wchar_t '. – caf

+0

Lưu ý, một chữ multicharacter ví dụ như ''abcd'' * là * vẫn thuộc kiểu' int', với giá trị được xác định thực hiện. – Potatoswatter

5

Bởi vì là C, 'x' thực sự là một int, trong khi trong C + + nó là một char.

C++ cố gắng là thắt chặt gõ mạnh đó là một chút lỏng lẻo trong C.

+0

Hành vi hấp dẫn ... Tôi không phải là một anh chàng C nhưng điều này làm tôi ngạc nhiên. Vì vậy, khi bạn gọi 'printf ("% c ", 'x');', 4 byte được đẩy vào ngăn xếp cho các varargs, nhưng trong C + + nó sẽ chỉ là 1 byte? Làm thế nào mà có thể làm việc, xem xét các CRT không biết những gì ngôn ngữ được gọi là nó? – tenfour

+0

+1, trong thông số kỹ thuật! –

+4

@tenfour, nope - 4 byte cũng được đẩy vào C++. các cuộc gọi varargs có nhiều quy tắc quảng bá loại. –

7

C++ không phải là một superset của C. Đặc biệt nếu bạn sử dụng các phiên bản "hiện tại" - một trình biên dịch C++ 0x chế độ sẽ choke trên mã C99.

+0

Nhưng đó là vì (sau đó) tiêu chuẩn C99 mới không được tích hợp vào C++ – doron

+0

@ deus-ex C99 xuất hiện nhiều năm trước khi khởi động C++ 0x. Nếu họ muốn biến C thành tập hợp con, họ sẽ bao gồm những thay đổi. Trong thực tế, họ đã bao gồm một số người trong số họ. '#include ' đề cập đến 'stdint.h' của C99. – kwatford

+0

C và C++ đã được phân tách một chút với các phiên bản tiêu chuẩn gần đây. Tôi sẽ không mong đợi C99 được cuộn vào C++ 0x hoặc ngược lại, đối với các tính năng phổ biến. –

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