2010-12-14 8 views
42

ich auf einen Ausdruck in C wiewas typeof ((c) + 1) in C

kam
typeof((c) + 1) _tmp = c; 

Was genau bedeutet das?

Danke für die Antwort.

Nur ein Zweifel? Was ist, wenn der Typ von c eine Struktur anstelle der primitiven Typen ist, was wird +1 tun?

+3

ist Wie wird 'erklärt C'? – SiegeX

+1

nette Frage :-) – Anycorn

+1

wirklich nette Frage! Ich habe heute etwas Neues gelernt – slezica

Antwort

4

Es ist nicht Standard C. C hat keine typeof (es sei denn, Sie haben etwas mit benutzerdefinierten).

typeof ist normalerweise eine Compiler-Erweiterung (am wahrscheinlichsten GCC-Compiler). Sie können darüber hier

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

+9

Das ist wirklich nicht ' t erklären, was die '+ 1' tut – SiegeX

+2

@SiegeX: Dies erklärt auch nicht, was' = 'tut und was'; 'tut. Wenn eine so umfassende Frage wie "Was macht es?" wird gefragt, es liegt an der antwortenden Person zu entscheiden, was sie sagen soll und was nicht. Ich entschied, dass das obige ausreichend ist. – AnT

+9

Herzlichen Glückwunsch zu Ihrer Entscheidung. Wie auch immer, ich und viele andere (siehe andere Kommentare zu anderen Antworten) empfanden eine Erklärung dessen, was die "+ 1" tat, in Ordnung, da sie im Rahmen von "typeof" nicht intuitiv ist. – SiegeX

5

erstellen var _tmp st _tmp ist vom Typ upcast (max) von c oder int und legen Sie es auf den Wert der c lesen.

zB

char c -> int _tmp // char(c) + 1 is int 
float c -> float _tmp // float(c) + 1 is float 
+1

Was wird +1 tun? Ich verstehe die Verwendung von typeof, aber nicht zu verstehen, was + 1 in typeof tun – zombie

+1

@zom Kraft tmp int zu werden, wenn 'c' ist" kleiner "dann int – Anycorn

+0

Wo kommt die' + 1' ins Spiel? – SiegeX

56

typeof Der Bediener im Klar C (nicht C++) ist ein GCC zusätzlich zu dem Standard. Es teilt dem Compiler mit, dass Sie den in Klammern eingeschlossenen Typ des Ausdrucks verwenden möchten.

Mit typeof wie oben können Sie Variablen von Ihnen unbekannten Typen oder in diesem Kontext deklarieren, wobei Sie den Typ einer anderen Variablen als Referenz verwenden. Es kann auch zum Gießen verwendet werden.

Die + Operation innerhalb typeof hat eine besondere Wirkung. typeof((c) + 1) bedeutet "die Art von c, oder der Typ von 1, was auch immer nach der Förderung bleiben würde". Denken Sie daran, dass zum Beispiel Zeichen gefördert werden Ints wenn in Operationen mit Ints verwendet werden ints Schwimmer gefördert, den Schwimmer zu verdoppelt usw.

So typeof(int_variable + char_variable)int ist, da die char zu int gefördert werden würde ausführen die Operation.

Beachten Sie, dass nur der Compiler dieses Problem lösen kann: typeof wird nicht ausgewertet, es hat keinen Wert, nichts passiert zur Laufzeit. Die vollständige Beschreibung von typeof kann found here sein.

+0

@Santiago Lezica: Was ist der 'Typ von 1'? Tut mir leid, ich habe das nicht – Cratylus

+0

@ user * hmm sagen wir sagen, wenn Sie '1' in Ihrem Code schreiben, nimmt der Compiler an, dass das eine Ganzzahl mit dem Wert 1 ist. Der Typ von' 1' ist 'int'. – slezica

+0

@Santiago Lezica: So ist es Compiler spezifisch, was ist der Typ? – Cratylus

1

Typeof gibt einen Typ zurück und wird zur Kompilierzeit ausgewertet.

Die gesamte Anweisung bedeutet eine Variable tmp mit dem gleichen Typ wie c (normalerweise) deklarieren.

Es könnte einen verwandten oder anderen Typ deklarieren, da der Typ von c + 1 anders als c sein kann. (Dies ist wahrscheinlicher in C++).

+0

Sogar in C, wenn 'c' ist' char' oder 'short' und' int' ist größer dann wird der Typ des Ausdrucks 'c + 1' durch' int' . Wenn "c" ein größerer ganzzahliger Typ ist oder ein "float" oder "double" ist, dann ist der Typ des Ausdrucks der Typ von "c". Es erfordert nicht C++, um etwas Verwirrung über Typen zu bekommen ... – RBerteig

+1

Was ist, wenn der Typ von c hier eine Struktur ist, was dann + 1? – zombie

4

Zusätzlich zu der anderen Antwort ist die + hier ziemlich subtil. Es ermöglicht c entweder einen Ausdruck oder einen Typ.

  • Wenn es Ausdruck dann ist, wie gesagt, c zu int (mindestens) gefördert wird und die Art des gesamten Ausdrucks hat mindestens integer Rang int.
  • Wenn es eine Art Ausdruck ist die Klammer um c machen es eine Besetzung des Werts +1. Also dann ist der resultierende Typ nur c.

Für beide Arten von Akrobatik ist es wichtig, dass c der Arithmetik-Typ ist, und es ist auch, dass dieser Trick hier zu beachten, könnte die Signedness von c verlieren. So ist diese Verwendung der typeof Erweiterung nicht so nützlich, wie es aussehen könnte. In den meisten Fällen wäre die Verwendung von uintmax_t oder intmax_t ausreichend.

4

Vergleichen Sie den Code,

typeof((c) + 1) _tmp = c; 

mit

typeof(c) _tmp = c; 

typeof Argumente der Typen oder Variablen erlaubt. Betrachten wir nun c wie

  • struct { int a; int b }
  • ein Zeiger auf struct { int a; int b }
  • den eigentlichen Text int.

Neben charper uʍop ǝpısdn schützt das Makro vor einer struct Zuordnung zu fördern. So ist der folgende Code wird nicht kompiliert,

struct { int a; int b } c; 
typeof((c)+1) _tmp = c; 

Menschen struct Zuweisungen für Effizienz und Codegröße Gründen, vor allem mit in einem allgemeinen Makro verbieten möchte.

1

Meiner Meinung nach, nur für Zeiger, typeof((c) + 1) = typeof(c); so vielleicht dies versichern die Weitergabe Parameter Zeiger