Domanda

Il seguente codice è legale secondo C99?

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

Si può supporre che prima della riga 3 la variabile x non sia mai stata dichiarata.

C99 (PDF)

Finora ho trovato solo quanto segue, ma non credo che sia sufficiente:

Un blocco consente di raggruppare un insieme di dichiarazioni e istruzioni in un'unità sintattica.Vengono valutati gli inizializzatori di oggetti che hanno una durata automatica di archiviazione e i dichiaratori dell'array di lunghezza variabile degli identificatori ordinari con portata a blocchi Raggiunto nell'ordine di esecuzione, come se fosse una dichiarazione e all'interno di ciascuna dichiarazione nell'ordine che compaiono i dichiaratori.

Dalla pagina 145 di quel PDF.

È stato utile?

Soluzione

Sì, è possibile dichiarare o definire una variabile ovunque si desidera in C99 (all'inizio di un blocco in C89).

Hai detto:

  

"Si può supporre che prima linea 3 della   variabile x non è mai stato dichiarato. "

Anche se è stato precedentemente dichiarato, si potrebbe dichiarare un nuovo variabile con lo stesso nome. Facendo che impedisce l'accesso alla vecchia variabile all'interno di tale blocco.

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 */

Non ho mai provato quanto segue in C99. Io davvero non so cosa succede :)
Ci proverò più tardi, quando ho accesso a un (quasi) compilatore C99

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

La caratteristica C99 di dichiarare / definire variabili ovunque che si vuole non è una caratteristica che mi fa venire voglia di cambiare:)

Altri suggerimenti

Questo è legale sia in C99 che in C89.Guarda 6.8.2 , che definisce l'istruzione composta

Sì, è possibile creare una variabile all'inizio di qualsiasi blocco. La variabile viene inizializzata ogni volta che il blocco viene inserito in C ++, è possibile creare ovunque all'interno del blocco.

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

Sì questo è legale in C99, ma non si è autorizzati ad accedere 'x' dopo il block.It sarebbe essere indefinito Comportamento tentativo di accedere 'x' oltre il suo ambito di applicazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top