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
.
Nguồn
2010-10-18 13:36:41
% d là số nguyên đã ký, không nói gì về số byte liên quan ... – leppie
@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. –
''a'' có loại' int' không 'char'. –