2016-09-05 4 views
0

Ich weiß über Speicherklassen in C. Ich wundere mich über das Schlüsselwort auto.Problem mit automatischer Variable

In dem folgenden Ausdruck,

auto int i = 0; 

auto ist die Speicherklasse Spezifizierer, int ist der Datentyp.

Aber wenn wir schreiben:

int auto i = 0; 

Was passiert? Handelt es sich um den Datentyp ?

+5

Nur eine kurze Notiz hier. Niemand schreibt "auto" oder "register" in C-Code, der in den letzten 20 Jahren geschrieben wurde. Vor allem "auto", da es von C++ uminterpretiert wurde, um etwas anderes zu bedeuten. – Art

+0

@Art: Sie wünschen ... Die 15 Jahre alte Codebase, auf der ich jeden Tag arbeite, ist gespickt mit 'Register' Deklarationen (typischerweise an fragwürdigen Stellen).(Obwohl ich "auto" zustimme, habe ich es nie in echtem Code gesehen, auch nicht schlecht) –

+1

@MatteoItalia Ich hätte etwas sagen sollen "gelernt in den letzten 20 Jahren zu programmieren", aber das wäre auch nicht wahr . Ich habe frisch gebildete Menschen gesehen, die Steinzeitpraktiken befolgt haben, weil sie von jemandem gelernt haben, der in den 80er Jahren "alles, was es zu wissen gibt", gelernt hat. – Art

Antwort

6

Die Bestellung von Speicherklassen-Spezifizierer (extern, static, register, auto, typedef) bezüglich Spezifizierer Typ (int, double, char, etc.) keine Rolle spielt. Beide sind gültig und deklarieren das gleiche Objekt.

Es ist jedoch eine gute Praxis, sich an eine bestimmte Reihenfolge zu halten. Die Spezifizierer-Qualifizierer Liste, die die declarator (i in Ihrem Fall) vorausgeht besteht aus verschiedenen Gruppen von Schlüsselwort, die in der folgenden Reihenfolge am besten verwendet werden:

  • Lagerklasse Bezeich, falls vorhanden: static, extern, auto, registertypedef, _Thread_local (C11);
  • Art Qualifier, falls vorhanden: const, volatile, restrict;
  • Typmodifikatoren, falls vorhanden: signed, unsigned, short, long;
  • Der Typspezifizierer:

    static const volatile unsigned long int a; 
    

    statt (ein extremes Beispiel): int, char, double, float usw.

dieser Regel verfolgt lesbarer Erklärungen wie diese führen würde:

unsigned volatile int static const long a; 
4

Mit der C-Grammatik können Sie die Speicherspezifikationen festlegen In beiden Positionen gibt es keine Mehrdeutigkeit, da der Schnittpunkt zwischen dem Satz gültiger Typen und einem gültigen Speicherbezeichner leer ist. Normalerweise habe ich den Speicher-Spezifizierer immer vor dem Typ geschrieben, also solltest du dich wahrscheinlich an diese Konvention halten, damit andere Leute sie leichter lesen können.

(auch vermeiden auto verwenden, niemand nutzt es, weil es immer impliziert ist, bis zu dem Punkt, dass C++ auch dieses Schlüsselwort für Variablen mit abgeleiteten Typ umgewidmet)