2016-07-14 15 views
7

tôi là nhầm lẫn về sizeof nhà điều hành trong C.Lẫn lộn về điều hành sizeof trong C

#include <stdio.h> 

int main(void) 
{ 
    char num1=1, num2=2, result; 
    result = num1 + num2; 
    printf("Size of result: %d \n",sizeof result); 
    printf("Size of result: %d \n",sizeof(num1+num2)); 
} 

Kết quả là 1 và 4 tương ứng. Lý do tại sao điều này xảy ra?

+0

'sizeof (num1 + num2)' là sai về mặt logic. – i486

+3

@ i486 Ý của bạn là gì? – Jin

+0

@jwqwerty: Không sai về mặt logic một cách hợp lý, nhưng vô ích, vì bạn đang thu được kích thước của một đối tượng tạm thời chỉ tồn tại trong khoảng thời gian xác định kích thước của nó. Trong sử dụng hàng ngày, bạn sẽ tìm kiếm 'sizeof (num1) + sizeof (num2)' nếu bạn ví dụ: muốn phân bổ không gian để tuần tự hóa dữ liệu. –

Trả lời

4

resultchar loại, do đó sizeof là cho 1 khi num1+num2 thăng int loại và do đó nó mang lại cho 4 (kích thước của int). Lưu ý rằng khi một phép toán số học được thực hiện trên một loại nhỏ hơn giá trị của int và tất cả giá trị của nó có thể được biểu thị bằng int thì kết quả sẽ được thăng lên loại int.

+0

Tại sao num1 + num2 được quảng bá thành loại int? – Jin

+0

@jwqwerty; Bởi vì hoạt động số học. – haccks

+0

@ haccks3 Sau đó, tôi đoán trong dòng "result = num1 + num2", num1 + num2 cũng nên được đẩy vào int bởi vì nó liên quan đến hoạt động số học? – Jin

3

num1 + num2 đang trở thành nguyên và do đó đầu ra là 4 trong khi kết quả là char mà kết quả đầu ra 1.

Bạn có thể tham khảo bài viết này Integer Promotion:

Nếu một int có thể đại diện cho tất cả các giá trị của các loại ban đầu, giá trị là được chuyển đổi thành int; nếu không, nó sẽ được chuyển thành int không dấu. Đây được gọi là chương trình khuyến mãi số nguyên. Tất cả các loại khác không thay đổi bằng các chương trình khuyến mãi số nguyên.

5

TL; DR câu trả lời:

  • sizeof result là giống như sizeof(char).
  • sizeof(num1+ num2) giống với sizeof (int)tại sao?

Trong trường hợp của bạn, chúng tạo ra 1 (được đảm bảo theo tiêu chuẩn) và 4 (có thể thay đổi) tương ứng.

Điều đó nói rằng, sizeof tạo ra một kết quả của loại size_t, vì vậy bạn nên %zu format specifier để in các giá trị.


Tại sao:

Thứ nhất, đối với các nhà điều hành bổ sung +, trích dẫn C11, chương §6.5.6

Nếu cả hai toán hạng có kiểu số học, chuyển đổi số học thông thường được thực hiện trên số chúng.

Về chuyển đổi số học thông thường, §6.3.1.8/p1

[....] Nếu không, nguyên chương trình khuyến mãi được thực hiện trên cả hai toán hạng. [...]

và sau đó từ §6.3.1.1,/p2,

Nếu một int thể đại diện cho tất cả các giá trị của các loại gốc (như hạn chế bởi chiều rộng, cho một chút trường ), giá trị được chuyển đổi thành int; nếu không, nó được chuyển đổi thành một số unsigned int. Đây được gọi là các quảng cáo số nguyên .

Vì vậy, sizeof(num1+num2) giống với sizeof(int).

0

kích thước của một char là 1byte, char có thể chứa giá trị tối đa 127 (không được ký tối đa 255). khi bạn nói điều gì đó như (a + b) một biến tạm thời được tạo và được sử dụng để thêm a vào b, vì a và b chỉ có thể chứa 127, chúng được trình biên dịch quảng cáo là int, chỉ để chắc chắn.

hợp lý vì nếu a = 100 và b = 100, người dùng muốn xem 200 khi anh ấy thêm họ chứ không phải 73 (là kết quả của quá trình tràn).