Kích thước ký tự ('a') trong C / C ++


298

Kích thước của nhân vật trong C và C ++ là gì? Theo tôi biết kích thước của char là 1 byte ở cả C và C ++.

Trong C:

#include <stdio.h>
int main()
{
    printf("Size of char : %d\n", sizeof(char));
    return 0;
}

Trong C ++:

#include <iostream>
int main()
{
    std::cout << "Size of char : " << sizeof(char) << "\n";
    return 0;
}

Không có gì ngạc nhiên, cả hai đều cho đầu ra: Size of char : 1

Bây giờ chúng ta biết rằng nhân vật được biểu diễn như 'a', 'b', 'c', '|', ... Vì vậy, tôi chỉ cần sửa đổi các mã trên để sau đây:

Trong C:

#include <stdio.h>
int main()
{
    char a = 'a';
    printf("Size of char : %d\n", sizeof(a));
    printf("Size of char : %d\n", sizeof('a'));
    return 0;
}

Đầu ra:

Size of char : 1
Size of char : 4

Trong C ++:

#include <iostream>
int main()
{
    char a = 'a';
    std::cout << "Size of char : " << sizeof(a) << "\n";
    std::cout << "Size of char : " << sizeof('a') << "\n";
    return 0;
}

Đầu ra:

Size of char : 1
Size of char : 1

Tại sao sizeof('a')trả về các giá trị khác nhau trong C và C ++?


8
Các "%|"định dạng yêu cầu một inttham số (hoặc cái gì đó thúc đẩy để int). sizeofmang lại một kết quả của loại size_t. Hoặc chuyển đổi sang intsử dụng diễn viên hoặc, nếu triển khai của bạn hỗ trợ nó, hãy sử dụng "%zu".
Keith Thompson

Câu trả lời:


348

Trong C, loại hằng số ký tự giống như 'a'thực sự là một int, với kích thước 4 (hoặc một số giá trị phụ thuộc thực hiện khác). Trong C ++, loại là char, với kích thước là 1. Đây là một trong nhiều khác biệt nhỏ giữa hai ngôn ngữ.


12
Trong Tiêu chuẩn C ++, phần 2.13.2 / 1, trong C 6.4.4.4, ít nhất là trong tài liệu tôi có.

14
+1 (Ngoại trừ điều đó, mặc dù "kích thước 4" rõ ràng áp dụng cho nền tảng của nthrgeek, nhưng nó không nhất thiết phải áp dụng cho tất cả các nền tảng.)
sbi

28
@nthrgeek: Tôi quá lười để trích dẫn cả hai tiêu chuẩn, nhưng tiêu chuẩn C ++ có một phụ lục dành riêng cho sự không tương thích với C. Theo Phụ lục C.1.1, nó đề cập rằng "Loại ký tự được thay đổi từ intthành char, giải thích hành vi. :)
jalf

3
@nthrgeek: §6.4.4.4, đoạn 10: "Hằng số ký tự nguyên có kiểu int. Giá trị của hằng số nguyên chứa một ký tự ánh xạ tới ký tự thực thi một byte là giá trị số của biểu diễn được ánh xạ ký tự được hiểu là một số nguyên. "
Stephen Canon

7
@nthrgeek: Bạn không nên yêu cầu một tài liệu tham khảo tiêu chuẩn trừ khi bạn đang tranh luận về một điểm cụ thể và bạn muốn hiểu lý do tại sao người khác có ý kiến ​​khác. Nếu mọi người đồng ý chỉ cần chấp nhận nó. Bạn (với tư cách là một nhà phát triển) nên khá thông minh, đủ để nhanh chóng tìm ra câu trả lời chung như thế này.
Martin York

26

Như Paul đã nói, đó là bởi vì 'a'một inttrong C nhưng mộtchar C ++.

Tôi đề cập đến sự khác biệt cụ thể giữa C và C ++ trong một vài thứ tôi đã viết cách đây vài năm, tại: http://david.tribble.com/text/cdiffs.htmlm


4
Chỉ tò mò, nhưng bạn có đang cập nhật tài liệu (rất chi tiết) đó để đưa vào những thay đổi mới trong C ++ 11 và C11 không?
Adam Rosenfield

Không phải lúc này. Mối quan tâm của tôi đối với C và C ++ đã suy yếu rất nhiều trong năm năm qua hoặc lâu hơn.
David R Tribble

3
Uh, tôi đã sử dụng công việc của bạn để viết này và ở đây bạn đang ở trên SO. Thật là một thế giới nhỏ bé!

17

Trong C, loại ký tự chữ là intchar trong C ++. Đây là trong C ++ cần thiết để hỗ trợ quá tải chức năng . Xem ví dụ này:

void foo(char c)
{
    puts("char");
}
void foo(int i)
{
    puts("int");
}
int main()
{
    foo('i');
    return 0;
}

Đầu ra:

char

5

Trong ngôn ngữ C , ký tự chữ không phải là một charloại. C coi ký tự bằng chữ là số nguyên. Vì vậy, không có sự khác biệt giữa sizeof('a')sizeof(1).

Vì vậy, ký tự sizeof bằng số nguyên sizeof trong C.

Trong ngôn ngữ C ++ , ký tự chữ là loại char. Các cppreference nói là:

1) nhân vật hẹp theo nghĩa đen hoặc thông thường ký tự chữ, ví dụ 'a'hay '\n'hay '\13'. Nghĩa đen như vậy có loạichar và giá trị bằng với đại diện của c-char trong bộ ký tự thực thi. Nếu c-char không thể biểu diễn dưới dạng một byte trong bộ ký tự thực thi, thì chữ có kiểu int và giá trị do xác định thực hiện.

Vì vậy, trong C ++ ký tự chữ là một loại char. vì vậy, kích thước của ký tự bằng chữ trong C ++ là một byte.

Alos, Trong các chương trình của bạn, bạn đã sử dụng định dạng định dạng sai cho sizeoftoán tử.

C11 §7.21.6.1 (P9):

Nếu một đặc tả chuyển đổi không hợp lệ, hành vi không được xác định.275) Nếu bất kỳ đối số nào không phải là loại chính xác cho đặc điểm kỹ thuật chuyển đổi tương ứng, thì hành vi đó không được xác định.

Vì vậy, bạn nên sử dụng %zuđịnh dạng định dạng thay vì %d, nếu không đó là hành vi không xác định trong C.


%zukhông được hỗ trợ trên nhiều nền tảng, nhưng tính di động, sử dụng (int)sizeof(char)và định dạng tốt hơn%d
chqrlie

Giá trị của ký tự chữ không nhất thiết là mã ASCII tương ứng. Nó phụ thuộc vào các bộ ký tự nguồn và thực thi và charloại mặc định được ký hoặc không dấu.
chqrlie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.