Ich bin auf einen Ausdruck in C wie gestoßen
typeof((c) + 1) _tmp = c;
Was genau bedeutet das?
Danke für die Antwort.
Nur ein Zweifel? Was ist, wenn der Typ von c struct anstelle der primitiven Typen ist, was wird dann +1 tun?
Zombie
Ich bin auf einen Ausdruck in C wie gestoßen
typeof((c) + 1) _tmp = c;
Was genau bedeutet das?
Danke für die Antwort.
Nur ein Zweifel? Was ist, wenn der Typ von c struct anstelle der primitiven Typen ist, was wird dann +1 tun?
sležica
Das typeof
operator in Plain C (nicht C++) ist eine GCC-Ergänzung zum Standard. Es teilt dem Compiler mit, dass Sie den Typ des in Klammern eingeschlossenen Ausdrucks verwenden möchten.
Verwenden typeof
Wie oben können Sie Variablen von Typen deklarieren, die Ihnen oder in diesem Kontext unbekannt sind, indem Sie den Typ einer anderen Variable als Referenz verwenden. Es kann auch zum Gießen verwendet werden.
Das +
Betrieb drinnen typeof
hat eine eigentümliche Wirkung. typeof((c) + 1)
meint “der Typ c oder der Typ 1, je nachdem, was nach der Beförderung übrig bleiben würde”. Denken Sie daran, dass zum Beispiel chars zu ints hochgestuft werden, wenn sie in Operationen mit ints verwendet werden, ints zu floats, floats zu doubles usw. hochgestuft werden.
So, typeof(int_variable + char_variable)
ist int
seit der char
befördert würden int
um die Operation durchzuführen.
Beachten Sie, dass nur der Compiler dies lösen kann: typeof
wertet nicht aus, hat keinen Wert, nichts passiert zur Laufzeit.
Die vollständige Beschreibung von typeof
kann sein hier gefunden.
@Santiago Lezica:was ist das type of 1
? Entschuldigung, ich habe das nicht verstanden
– Kratylos
14. Dezember 2010 um 8:07 Uhr
@user* hmm sagen wir das mal wenn du schreibst 1
In Ihrem Code geht der Compiler davon aus, dass es sich um eine Ganzzahl mit dem Wert 1 handelt. Der Typ von 1
ist int
.
– sležica
14. Dezember 2010 um 8:08 Uhr
@Santiago Lezica: Es ist also Compiler-spezifisch, was ist der Typ?
– Kratylus
14. Dezember 2010 um 8:24 Uhr
@user* Nun, darauf können Sie sicher wetten int
meistens überall, aber wie gesagt, typeof
ist sowieso ein GNU C Compiler (GCC) Feature, es ist nicht Standard in C.
– sležica
14. Dezember 2010 um 8:26 Uhr
Was ist, wenn der Typ von c hier eine Struktur ist, was wird dann + 1 tun?
– Zombie
14. Dezember 2010 um 8:57 Uhr
Irgendein Korn
Var erstellen _tmp
st _tmp
ist vom Typ upcast (max) von c
oder int
und setze es auf den Wert von c
.
z.B
char c -> int _tmp // char(c) + 1 is int
float c -> float _tmp // float(c) + 1 is float
Was wird +1 tun? Ich verstehe die Verwendung von typeof, verstehe aber nicht, was + 1 in typeof bewirkt
– Zombie
14. Dezember 2010 um 7:44 Uhr
@zom erzwingt, dass tmp int wird, wenn c
ist “kleiner” als int
– Irgendein Korn
14. Dezember 2010 um 7:45 Uhr
Wo kommt die +1
komm in das Spiel?
– SiegeX
14. Dezember 2010 um 7:46 Uhr
@Stilgar liegt das an der Integer-Promotion?
– SiegeX
14. Dezember 2010 um 7:51 Uhr
Kurz gesagt: Ja, es liegt an der Integer-Promotion.
– Karl Knechtel
14. Dezember 2010 um 8:00 Uhr
Zusätzlich zu der anderen Antwort, der +
hier ist ganz subtil. Es ermöglicht c
entweder ein Ausdruck oder ein Typ sein.
c
befördert wird int
(mindestens) und der Typ des gesamten Ausdrucks hat mindestens den ganzzahligen Rang von int
.c
machen Sie es zu einer Besetzung des Wertes +1
. Der resultierende Typ ist also gerecht c
.Für beide Arten von Akrobatik ist das wichtig c
ist vom arithmetischen Typ und es ist auch zu beachten, dass dieser Trick hier die Vorzeichen von verlieren könnte c
. Also diese Verwendung der typeof
Erweiterung ist nicht so nützlich, wie es aussehen mag. In den meisten Fällen mit uintmax_t
oder intmax_t
würde reichen.
Es ist kein Standard-C. C hat so etwas wie nicht typeof
(es sei denn, Sie haben es mit etwas Benutzerdefiniertem zu tun).
typeof
ist normalerweise eine Compiler-Erweiterung (höchstwahrscheinlich GCC-Compiler). Hier können Sie darüber lesen
kunstloser Lärm
Code vergleichen,
typeof((c) + 1) _tmp = c;
mit
typeof(c) _tmp = c;
typeof
erlaubt Argumente von Typen oder Variablen. Jetzt bedenke c
wie,
struct { int a; int b }
struct { int a; int b }
int
.Ebenso gut wie Förderung char
gemäß uʍop ǝpısdnschützt das Makro vor a struct
Abtretung. Der folgende Code wird also nicht kompiliert,
struct { int a; int b } c;
typeof((c)+1) _tmp = c;
Die Leute möchten vielleicht verbieten struct
Zuweisungen aus Gründen der Effizienz und Codegröße, insbesondere innerhalb eines generischen Makros.
Alex Braun
Typeof gibt einen Typ zurück und wird zur Kompilierzeit ausgewertet.
Die ganze Anweisung bedeutet, eine Variable zu deklarieren tmp
mit demselben Typ wie c (normalerweise).
Es könnte einen verwandten oder anderen Typ deklarieren, da der Typ von c+1 von c verschieden sein kann. (Dies ist wahrscheinlicher in c++).
Alex
Meiner Meinung nach nur für Zeiger, typeof((c) + 1) = typeof(c);
Dies kann also sicherstellen, dass der Übergabeparameter ein Zeiger ist
gcc.gnu.org/onlinedocs/gcc/Typeof.html
– Göz
14. Dezember 2010 um 7:41 Uhr
wirklich schöne Frage! Ich habe heute etwas Neues gelernt
– sležica
14. Dezember 2010 um 8:14 Uhr
@SiegeX – Wahrscheinlich als
#define MACRO(..., c, ...)
– Chris Lutz
14. Dezember 2010 um 9:16 Uhr