Sind alles Variante identisch
-
Zunächst mal ist "printf" in C++ nicht das übliche Mittel zur Ausgabe von Text.
Das würde in C++ eher so aussehen:
#include <iostream> int main() { float x = 0; std::cout << "der Type float hat Groesse von " << sizeof(float ) << " Byte\n"; std::cout << "der Type float hat Groesse von " << sizeof( x ) << " Byte\n"; return 0; }
In dem Fall hätte das sogar den Charme dass du das Ergebnis von "sizeof" gar nicht erst in einen anderen ganzzahligen Typen casten müsstest, weil der Stream alle möglichen Typen bereits akzeptiert.
-
Ich verschiebe das mal nach C
-
@manni66 sagte in Sind alles Variante identisch:
Warum kommt man auf die Idee, das Ergbnis von sizeof zu casten?
Vermutlich weil der Compiler vor dem falschen Formatspecifier warnt, siehe Beitrag von DirkB.
-
oder um verständnisfragen bzw. übungsaufgaben zu formulieren.
die antwort lautet übrigens ganz klar nein, weil der rückgabewert von sizeof size_t ist und dieses unsigned long sein kann, aber nicht sein muss. siehe https://en.cppreference.com/w/cpp/language/sizeof und https://en.cppreference.com/w/cpp/types/size_t
-
Warum kommt man auf die Idee, das Ergbnis von sizeof zu casten?
Weil der Ergebnistyp des operators sizeof size_t ist und es dafür vor C99 in ANSI C noch keinen printf-Formatspezifizierer "%zu" gab;
für unsigned long gab es schon immer den Formatspezifizierer %lu
-
@SeppJ sagte in Sind alles Variante identisch:
@manni66 sagte in Sind alles Variante identisch:
Warum kommt man auf die Idee, das Ergbnis von sizeof zu casten?
Vermutlich weil der Compiler vor dem falschen Formatspecifier warnt, siehe Beitrag von DirkB.
und man zu doof ist, std::cout zu benutzen. Aber jetzt ist es ja "offiziell" C ...
-
@manni66 sagte in Sind alles Variante identisch:
und man zu doof ist, std::cout zu benutzen.
oder das richtige Unterforum zu finden.
-
@DirkB ich lerne c , 1) Erste Frage : also meinst du auch c und nicht c++? ich kenne micht mit c++ nicht aus.
2)zweite Frage: meinst du für (x) muss ich den Formatspecifier(%lu) durch (%zu) ersetzen?
2) zweite Frage wozu diese ()?? ich habe den code von jemandem geschrieben und möchte die Struktur verstehen.
-
@Ibrahim
zu 1) ja, das ist C. Zu erkennen an<stdio.h>
und auch amprintf
Die C-Header heißen mittlerweile <cstdio> (ohne.h) und man benutztcout
, denn das ist Typsicherzu 2) Nein, nicht für x sondern für
sizeof
sizeof
gibt als Ergebnis einen Wert vom Typsize_t
. Das kann, muss aber nicht einunsigned long
seinzu zweiten 2) Welche () meinst du?
sizeof
ist keine Funktion sondern eine Anweisung, daher braucht es auch keine Klammern.
Wiereturn
auch.
Die () vor demsizeof
sind ein cast. Damit wird ein Wert in einen anderen Typ gewandelt.Der Formatspecifier %lu erwartet einen
unsigned long
. Mit dem cast erzwingst du diese Wandlung.
printf
erkennt das nicht automatisch, denn es ist nicht Typsicher
Der Compiler kann das mittlerweile erkennen und gibt dann eine Warnung.
-
@Ibrahim du kannst sowohl
sizeof x
als auchsizeof(x)
schreiben.
-
@DirkB sagte in Sind alles Variante identisch:
sizeof
ist keine Funktion sondern eine Anweisung, daher braucht es auch keine Klammern.sizeof
ist keine Anweisung. Das ist ein Schlüsselwort, mit dem ein Ausdruck gebildet wird, also bestenfalls vielleicht ein Operator.