2012-07-25 35 views
21

thể trùng lặp:
Size of character ('a') in C/C++Tại sao đầu ra của chương trình này khác nhau giữa C và C++?

Chương trình sau

#include <stdio.h> 

int main() 
{ 
    printf("%d\n", sizeof('\0')); 
    printf("%d\n", sizeof(0)); 
} 

biên soạn với kết quả đầu ra gcc

4 
4 

và wit h g ++

1 
4 

Tại sao điều này xảy ra? Tôi biết điều này không phải là một điều trình biên dịch nhưng một sự khác biệt giữa C và C + + nhưng lý do là gì?

+25

Giống như phụ thuộc _language_ hơn! – Shahbaz

+0

Tại sao bạn làm điều này ngay từ đầu, vì tò mò? – Aerovistae

Trả lời

35

Trong C, nhân vật hằng có loại int mỗi 6.4.4.4 (10) của tiêu chuẩn,

Một số nguyên nhân vật liên tục có kiểu int. Giá trị của hằng số ký tự nguyên chứa một ký tự đơn lẻ ánh xạ tới một ký tự thực hiện một byte là giá trị số của đại diện của ký tự được ánh xạ được diễn giải dưới dạng số nguyên.

Vì vậy, bạn sẽ in kích thước của int hai lần.

Trong C++, các hằng số ký tự có loại char.

12

Ký tự chữ số \0 được coi là int trong C, vì vậy bạn thực sự kết thúc việc in sizeof(int) thay vì sizeof(char).

ideone cho kết quả tương tự (C, C++).

+1

@Konrad, đúng, mọi thứ nhỏ hơn 'int' được coi là' int' trong C. Cố định. –

+0

Không, điều đó cũng không đúng, không phải * mọi thứ * được coi là 'int', chỉ các ký tự chữ: http://ideone.com/ZQIPC –

+0

@Konrad, kiểm tra' short' trong ví dụ của bạn sử dụng dàn diễn viên.Tất nhiên, không có cách nào để diễn đạt một chữ 'ngắn', vì vậy ngay cả một giá trị phù hợp trong một' short' được phân tích như là một 'int' từ get-go. Thật vậy, sẽ rất thú vị nếu biết một chữ ‘ngắn’ sẽ được xử lý giống như chữ 'char' ... –

4

Trong các ký tự chữ C là ints. Trong C++ chúng là ký tự.

0

Đầu ra đã phụ thuộc vào trình biên dịch vì bạn sử dụng trình định dạng sai cho size_t điều này sẽ là %zu. Trên các hệ thống 64 bit có kích thước size_t rộng hơn int, điều này có thể cung cấp cho bạn bất kỳ loại rác nào.

Nếu không, shure này phụ thuộc vào trình biên dịch. Cả hai giá trị mà bạn cố in kích thước là int trong C và charint trong C++. Vì vậy, trong C, điều này thường sẽ cung cấp cho bạn 4 4 hoặc 8 8 và bằng C++ 1 4 hoặc 1 8.

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