Warum unterscheidet sich die Größe des Datentyps, wenn der Wert direkt an den Operator sizeof übergeben wird?

15
#include <stdio.h>
int main() {
    char a = 'A';
    int b = 90000;
    float c = 6.5;
    printf("%d ",sizeof(6.5));
    printf("%d ",sizeof(90000));
    printf("%d ",sizeof('A'));
    printf("%d ",sizeof(c));
    printf("%d ",sizeof(b));
    printf("%d",sizeof(a));
    return 0;
}

Die Ausgabe ist:

8 4 4 4 4 1

Warum unterscheidet sich die Ausgabe für dieselben Werte?

js
quelle
12
6.5ist kein Schwimmer, es ist eindouble
NathanOliver
printf("%d",sizeof(6.5f));um es zu machen a float.
Johnny Mopp
2
"Warum ist die Ausgabe hier anders?" warum sollte es das gleiche sein? Die Tatsache, dass Sie einander zuweisen können, bedeutet nicht, dass sie genau den gleichen Typ haben.
Slava
5
Der Formatbezeichner sollte zum Beispiel seinprintf("%zu", sizeof(6.5));
Wetterfahne

Antworten:

9

Zeichenkonstanten in C (im Gegensatz zu C ++) haben den Typ int. Also dieser Anruf

printf("%d",sizeof('A'));

Ausgänge 4. Das sizeof( 'A' )ist gleich sizeof( int ).

Aus dem C-Standard (6.4.4.4 Zeichenkonstanten)

10 Eine ganzzahlige Zeichenkonstante hat den Typ int ....

Auf der anderen Seite (6.5.3.4 Die Größe und Ausrichtung der Operatoren)

4 Wenn sizeof auf einen Operanden angewendet wird, der den Typ char, ein vorzeichenloses Zeichen oder ein vorzeichenbehaftetes Zeichen (oder eine qualifizierte Version davon) hat, ist das Ergebnis 1.

Der Operand des sizeofOperators in diesem Ausdruck sizeof( 'A' )hat also den Typ int, während in diesem Ausdruck sizeof( a )a wie folgt deklariert ist

char a = 'A';

Der Operand hat den Typ char.

Achten Sie darauf, dass Anrufe wie diese

printf("%d",sizeof(6.5));

Verwenden Sie einen falschen Konvertierungsformatbezeichner. Du musst schreiben

printf("%zu",sizeof(6.5));

Auch im obigen Aufruf wird doublewährend dieses Aufrufs eine Konstante des Typs verwendet

printf("%zu",sizeof(c));

Die Variable chat den Typ float.

Sie könnten das gleiche Ergebnis für diese Aufrufe erhalten, wenn der erste Aufruf eine Konstante vom Typ float like verwendet

printf("%zu",sizeof(6.5f));
Vlad aus Moskau
quelle
19

Konstanten haben wie Variablen einen eigenen Typ:

  • 6.5 : Eine Gleitkommakonstante vom Typ double
  • 90000: Eine Ganzzahlkonstante vom Typ int(wenn int32 Bit) oder long(wennint 16 Bit)
  • 'A' : Eine Zeichenkonstante vom Typ intin C und charin C ++

Die gedruckten Größen sind die Größen der oben genannten Typen.

Auch das Ergebnis des sizeofOperators hat Typ size_t. Also , wenn die Spezifikations richtigen Format zu verwenden Druck ist %zu, nicht %d.

dbush
quelle
1

Weil die Werte keine Rolle spielen sizeof. Es ist die Größe der Typen.

  • Zeichenkonstanten sind ints, nicht chars.

  • Gleitkommakonstanten sind standardmäßig doubles, es sei denn, Sie fügen sie mit foder hinzu l.

SS Anne
quelle