2013-05-07 28 views
8
#include <stdio.h> 
int main()   
{ 

      short int i = 20; 

      char c = 97; 

      printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i)); 
      return 0; 
} 

một ai có thể cho tôi biết những gì sẽ xảy ra khi sizeof (a + b) "một là loại ngắn int & b là kiểu char" Output là: 2, 1, 4Điều gì xảy ra ở đây? sizeof (short_int_variable + char_variable)

+0

'sizeof 'là một cấu trúc thời gian biên dịch. –

+0

kích thước của kết quả được tính là int – BLUEPIXY

+0

Bạn chưa đề cập đến kích thước đó (c + c) cũng sẽ cho 4, vì vậy sizeof (c/2) hoặc sizeof (1998) – Kartikya

Trả lời

8

Do C chuẩn integral promotion rules, kiểu của biểu thức c + iint, vì vậy đó là lý do tại sao bạn đang nhận được tương đương với sizeof (int).

Lưu ý rằng sizeof không phải là hàm, chỉ cần đặt dấu ngoặc đơn khi đặt tên cho loại and to resolve precendence conflicts. coule mã của bạn được viết:

printf("%zu, %zu, %zu\n", sizeof i, sizeof c, sizeof (c + i)); 

Việc sử dụng cuối cùng của sizeof có ngoặc kể từ sizeof liên kết chặt chẽ hơn +, nói sizeof c + i sẽ được phân tích như (sizeof c) + i mà không phải là kết quả mong muốn.

Cũng lưu ý rằng đây là một cấu trúc biên dịch hầu hết thời gian, biểu thức không bao giờ thực sự được đánh giá. Tất cả những gì xảy ra là trình biên dịch "giả vờ" để đánh giá nó, để tìm ra loại biểu thức, và sau đó cung cấp cho bạn kích thước của một giá trị của loại đó. Giá trị thực tế không bao giờ cần phải tồn tại, đôi khi gọn gàng.

Loại giá trị trả về sizeofsize_t, được in bằng %zu (không phải là int).

+0

Và như bạn đã nói ở nơi khác, để tránh nhầm lẫn, luôn đặt khoảng trắng giữa 'sizeof' và dấu ngoặc đơn mở. (Tôi chỉ làm cho quy ước dí dỏm này rõ ràng cho người đọc) – Rerito

+1

mã phải là 'printf ("% zu,% zu,% zu \ n ", sizeof i, sizeof c, sizeof (c + i));' bởi vì ['sizeof' không trả về' int'] (https://stackoverflow.com/q/940087/995714) –

+0

@ LưuVĩnhPhúc Tuyệt đối, cảm ơn vì đã sửa câu trả lời cũ này. Chỉnh sửa, tất nhiên. – unwind

0

sizeof chỉ hoạt động tại compiletime để có được kích thước của một biểu thức.

Sau đây sẽ không thực sự tăng 'c':

c = sizeof (++ c);

Khái niệm sizeof (a + b) sẽ trả về kiểu lớn nhất với unsigned có ưu tiên

4
1) sizeof(i) ==> sizeof(short int) = 2 

2) sizeof(c) ==> sizeof(char) = 1 

3) sizeof(c + i [97+20]) ==> sizeof(int) = 4 // result in constant value which is int as default 
+0

downvotter. hãy giải thích những gì tôi hiểu sai? Tôi sẽ sửa lại cho tôi .. – Mani

+0

* "kết quả trong giá trị không đổi int là mặc định" * - Huh? Tôi thậm chí không hiểu những gì bạn đang nói về. –

+0

@ChristianRau Tôi nói về '(c + i)' dẫn đến giá trị không đổi được lấy làm 'int' theo mặc định. – Mani

0

Loại dữ liệu của a là "int ngắn". -32768 ~ +32767

Kiểu dữ liệu của c là "char". 0 ~ 255

Khi bạn thêm một c nó không phải là một trong hai ngắn int cũng không char, nó trở nên int!

Đây là là một ví dụ mã đó giúp bạn để có được những kiểu dữ liệu biến:

#include <typeinfo> 

int main() 
{ 
    short int a = 1; 
    char c = 'A'; 
    std::cout << typeid(a + c).name() << std::endl; 

    return 1; 
} 
+0

Một 'short' có phạm vi -32768 đến 32767. – Lindydancer

+0

Bạn đang phải ... Tôi đã phạm sai lầm. –

1

Như những người khác đã nói, sizeof được tính tại thời gian biên dịch.

Ở đây, giá trị của biểu thức c + i số nguyên, như c và tôi được đề bạt (khuyến mãi không thể thiếu) để int và do đó

sizeof(c + i) 

cung cấp cho bạn 4 byte trên máy tính 32-bit ..

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