2012-01-21 8 views
5

W języku C dostępne są flagi formatów "%c" i "%f" dla funkcji podobnych do printf - i scanf. Obie te funkcje używają argumentów o zmiennej długości: ..., które zawsze konwertują floats na doubles i chars na ints.Dlaczego `"% c "` istnieje w `printf`, jeśli` char` jest konwertowany na `int`?

Jeśli chodzi o konwersję, moje pytanie brzmi, dlaczego istnieją oddzielne flagi dla char i float? Dlaczego po prostu nie używać tych samych flag, co dla int i double?

pokrewne pytanie:
Why does scanf() need "%lf" for doubles, when printf() is okay with just "%f"?

Odpowiedz

8

Ponieważ droga robi wydrukowana jest inna.

printf("%d \n",100); //prints 100 
printf("%c \n",100); //prints d - the ascii character represented by 100 
+0

Och ... oczywiście. A co z 'float'? –

+3

@PaulManta: Flaga formatująca '% f' oczekuje na argument" double ". –

0

Ponieważ float i double mają różne reprezentacje maszynowych lub rozmiarów i konwencje wzywające: procesory mają wiele rejestrów dedykowanych zmiennoprzecinkowych, które mogą być stosowane do podawania argumentów.

a średnia C wymaga short argumenty są przekształcane int i float argumenty są przekształcane double.

+1

Należy zauważyć, że te konwersje nie są wykonywane dla wszystkich argumentów, tylko dla argumentów, w których deklaracja funkcji nie określa typu parametru. –

+0

@Keith: to, co jest istotne dla tego pytania, to że promocje są zawsze stosowane do varargs. Co, jak mówisz, jest podzbiorem "argumentów, w których deklaracja funkcji nie określa typu parametru". –

Powiązane problemy