2010-10-18 37 views
8

Tại sao cuộc gọi sau đây:printf quá thông minh đúc từ char để int?

printf("%d %d", 'a', 'b'); 

kết quả trong "đúng" 97 98 giá trị? % d cho biết chức năng phải đọc 4 byte dữ liệu và printf không thể cho biết loại đối số đã nhận (ngoài chuỗi định dạng), vậy tại sao không phải là số được in |a||b||junk||junk|?

Xin cảm ơn trước.

+0

% d là số nguyên đã ký, không nói gì về số byte liên quan ... – leppie

+2

@leppie: Tuy nhiên, nó phải được chuyển qua một số byte nhất định và 'printf' phải chọn một số lượng nhất định byte ra khỏi ngăn xếp cho nó, và những con số nhất định phải giống nhau. –

+4

''a'' có loại' int' không 'char'. –

Trả lời

14

Trong trường hợp này, các tham số nhận được printf sẽ thuộc loại int.

Trước hết, mọi thứ bạn chuyển sang printf (ngoại trừ tham số đầu tiên) đều trải qua "quảng cáo mặc định", có nghĩa là (01)và short đều được thăng cấp thành int trước khi được chuyển. Vì vậy, ngay cả khi những gì bạn đã vượt qua thực sự đã có loại char, bởi thời gian nó đã đến printf nó sẽ có loại int. Trong trường hợp của bạn, bạn đang sử dụng ký tự theo nghĩa đen, đã có kiểu int.

Điều tương tự cũng đúng với scanf và các chức năng khác có tham số Vd.

Thứ hai, ngay cả khi không khuyến mại mặc định, literals nhân vật trong C đã có loại int anyway (§6.4.4.4/10):

Một số nguyên nhân vật liên tục có kiểu int.

Vì vậy, trong trường hợp này các giá trị bắt đầu với loại int, và không được thăng chức - nhưng ngay cả khi bạn bắt đầu với char s, một cái gì đó như:

char a = 'a'; 

printf("%d", a); 

... những gì printf nhận sẽ thuộc loại int, không nhập char.

+1

Quảng cáo mặc định? Có thật không? Kể từ khi nào varargs làm chương trình khuyến mãi mặc định? Không phải là nó chỉ là kiểu chữ nhân vật là 'int'? –

+4

Có và không - có, một chữ char có kiểu 'int', nhưng ngay cả khi anh ta gán nó vào một' char' và thông qua đó, 'printf' vẫn sẽ nhận được' int', vì vậy nó khá không liên quan. –

+0

Ngay lập tức, Jerry. Cảm ơn. –

4

Trong C, một chữ char là giá trị loại int.

0

nó in DEC ASCII cho các ký tự do bạn nhập.

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