Frage

Ist der folgende Kodex nach C99 legal?

...
for(....) {
int x = 4;
...
}
...

Sie können annehmen, dass vor Zeile 3 die Variable X nie deklariert wurde.

C99 (PDF)

Bis jetzt habe ich nur Folgendes gefunden, aber ich glaube nicht, dass dies genug ist:

Ein Block ermöglicht es, eine Reihe von Deklarationen und Aussagen in eine syntaktische Einheit zu gruppieren. Die Initialisierer von Objekten mit einer automatischen Speicherdauer und die Anordnungen der variablen Längenarray -Deklaratoren gewöhnlicher Kennungen mit Blockbereich werden bewertet und die Werte werden in den Objekten gespeichert (einschließlich des Speicherns eines unbestimmten Wertes in Objekten ohne Initialisierer), wenn die Deklaration ist in der Reihenfolge der Ausführung erreicht, als wäre es eine Erklärung und innerhalb jeder Erklärung in der Reihenfolge, die Deklaratoren erscheinen.

Aus Seite 145 dieser PDF.

War es hilfreich?

Lösung

Ja, Sie können eine Variable überall in C99 deklarieren oder definieren (zu Beginn eines Blocks in C89).

Du sagtest:

"Sie können annehmen, dass vor Zeile 3 die Variable X nie deklariert wurde."

Auch wenn es zuvor deklariert wurde, könnten Sie a deklarieren Neu Variable mit demselben Namen. Wenn Sie dies tun, können Sie auf die alte Variable in diesem Block zugreifen.

int x = 0;               /* old x */
printf("%d\n", x);       /* old x, prints 0 */
do {
    int x = 42;          /* new x */
    printf("%d\n", x);   /* new x, prints 42 */
} while (0);
printf("%d\n", x);       /* old x, prints 0 */

Ich habe in C99 noch nie Folgendes ausprobiert. Ich weiß wirklich nicht, was passiert :)
Ich werde es später versuchen, wenn ich Zugriff auf einen (fast) C99 -Compiler bekomme

int x = 0;
do {
    printf("%d\n", x);   /* old x? new x? crash? Undefined Behaviour? */
    int x = 42;
} while (0);

Die C99 -Funktion der Deklaration/Definieren von Variablen, wo immer man will, ist keine Funktion, die mich dazu bringt, mich zu ändern :)

Andere Tipps

Dies ist sowohl in C99 als auch in C89 legal. Schauen Sie sich 6.8.2 an, das eine zusammengesetzte Aussage definiert

Ja, Sie können zu Beginn eines beliebigen Blocks eine Variable erstellen. Die Variable wird jedes Mal initialisiert, wenn der Block in C ++ eingegeben wird. Sie können sie überall im Block erstellen.

for(....)
{
  int x=4;
  /*More code*/
}

Ja, das ist in C99 legal, aber Sie dürfen nach dem Block nicht auf "X" zugreifen. Es wäre ein undefiniertes Verhalten, das versucht, Zugang zu "X" über seinen Geltungsbereich hinaus zuzugreifen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top