printf zu intelligent casting von char nach int?

8

Warum ruft der folgende Aufruf auf:

%Vor%

Ergebnis in den "richtigen" 97 98 -Werten? % d zeigt an, dass die Funktion 4 Bytes an Daten lesen muss, und printf sollte nicht in der Lage sein, den Typ der empfangenen Argumente anzugeben (abgesehen von der Formatzeichenfolge), also warum ist nicht die gedruckte Zahl |a||b||junk||junk| ?

Vielen Dank im Voraus.

    
Hila's Master 18.10.2010, 13:34
quelle

3 Antworten

14

In diesem Fall sind die von printf empfangenen Parameter vom Typ int .

Zunächst wird alles, was Sie printf übergeben (mit Ausnahme des ersten Parameters), "Standard-Promotions" durchlaufen, was (unter anderem) bedeutet, dass char und short beide vor dem Übergeben in int befördert werden. Also, selbst wenn das, was du passierst, wirklich char hatte, würde es printf geben, wenn es int hat. In Ihrem Fall verwenden Sie ein Zeichenliteral, das sowieso schon den Typ int hat.

Dasselbe gilt für scanf und andere Funktionen, die variadische Parameter verwenden.

Zweitens haben Zeichenliterale in C auch ohne Standardpromotionen bereits den Typ int anyway (§6.4.4.4 / 10):

  

Eine Ganzzahl-Zeichenkonstante hat den Typ int.

In diesem Fall beginnen die Werte mit dem Typ int und werden nicht hochgestuft - aber selbst wenn Sie mit char s angefangen haben, etwa wie folgt:

%Vor%

... was printf empfängt, wäre vom Typ int , nicht vom Typ char auf jeden Fall.

    
Jerry Coffin 18.10.2010, 13:36
quelle
4

In C ist ein Char-Literal ein Wert vom Typ int .

    
pmg 18.10.2010 13:36
quelle
0

es druckt das DEC ASCII für die von Ihnen eingegebenen Zeichen.

    
Sunscreen 18.10.2010 13:38
quelle

Tags und Links