was ist typeof((c) + 1) in C

Lesezeit: 4 Minuten

Benutzeravatar des Zombies
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?

  • 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

Benutzeravatar von slezica
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 intseit 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

Benutzeravatar von Anycorn
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.

  • Wenn es ein Ausdruck ist, dann, wie gesagt,
    c befördert wird int (mindestens) und der Typ des gesamten Ausdrucks hat mindestens den ganzzahligen Rang von int.
  • Wenn es sich um einen Typausdruck handelt, umschließen die Klammern 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

http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

Benutzeravatar von artless noise
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 }
  • ein Zeiger auf struct { int a; int b }
  • der eigentliche Text int.

Ebenso gut wie Förderung chargemäß 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.

Benutzeravatar von Alex Brown
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++).

Benutzeravatar von alecxe
Alex

Meiner Meinung nach nur für Zeiger, typeof((c) + 1) = typeof(c); Dies kann also sicherstellen, dass der Übergabeparameter ein Zeiger ist

1402160cookie-checkwas ist typeof((c) + 1) in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy