2010-10-18 19 views
8

neden şu çağrı:printf, char'dan int'ye kadar akıllı döküm?

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

sonuç "doğru" 97 98 değerlerinde? % d işlev verilerinin 4 bayt okumak zorunda belirtir ve printf (biçim dizesi yanı sıra) alınan argümanlar türünü söylemek mümkün olmamalı, o halde neden baskılı numara |a||b||junk||junk| değil mi?

Şimdiden teşekkürler.

Bu durumda
+0

% d imzalı bir tam sayıdır, ilgili baytların sayısı hakkında hiçbir şey söylemez ... – leppie

+2

@leppie: Ancak, belirli bir sayıda bayttan geçirilmesi gerekir ve printf'in belirli bir sayıyı seçmek zorundadır. Bunun için yığılmış baytlar ve bu belirli sayıların aynı olması gerekir. –

+4

'a ',' '' '' '' '' '' '' '' tür. –

cevap

14

, printf tarafından alınan parametreler tip int olacaktır. Her şeyden

İlk olarak, (ilk parametre hariç) printf geçmesi şey char ve short hem geçirilmeden önce int terfi ki (diğer şeylerin yanı sıra) anlamına gelen "varsayılan promosyonları", uğrar. Yani, gerçekten ne geçiyor olsaydınız bile tip char vardı, o zaman printf için var int tip olurdu. Durumunuzda zaten zaten int türüne sahip bir karakter literal kullanıyorsunuz.

aynı scanf ile doğrudur ve variadic parametreleri almak diğer fonksiyonlar.

bir tamsayı karakter sabiti tipi int olmalıdır: hatta varsayılan promosyonlar olmadan

İkincisi, C karakter değişmezleri zaten yine tipini int (§6.4.4.4/10) sahiptir.

Yani, bu durumda değerler tip int ile başlar ve terfi değildir - ama sen char s, gibi bir şey ile başladı bile: printf alan da ondan

char a = 'a'; 

printf("%d", a); 

... int tipinde, char türünde değil. C olarak

+1

Varsayılan promosyonlar? Gerçekten mi? Varargs ne zamandan beri varsayılan promosyonlar yapıyor? Sadece bir karakter değişmezinin türü "int" değil mi? –

+4

Evet ve hayır - evet, bir char literal 'int' türüne sahiptir, ancak bir "char" a atadıysa ve bunu geçse bile, "printf" hala bir "int" alacaktır, bu yüzden oldukça alakasız. –

+0

Doğru, Jerry. Teşekkürler. –

4

, değişmez bir char türü int bir değerdir.

0

Sizin tarafınızdan girilen karakterler için DEC ASCII yazdırır.