Sezione 6.6/3
, "Espressioni costanti", dello standard ISO C99 è la sezione richiesta. Essa afferma:
espressioni costanti non devono contenere l'assegnazione, incremento, decremento, la funzione chiamata, o virgola gli operatori, tranne quando sono contenuti all'interno di una sottoespressione che non è valutata.
Nel documento logica C99 da ISO, c'è questo piccolo frammento:
Un numero intero espressione costante deve coinvolgere solo numeri conoscibili al momento della traduzione, e operatori senza effetti collaterali.
E, dal momento che non c'è nessun punto nel usando l'operatore virgola affatto se non stai basandosi su effetti collaterali, è inutile in un'espressione costante.
Con questo, voglio dire non c'è assolutamente nessuna differenza tra i due segmenti di codice:
while (10, 1) { ... }
while (1) { ... }
dal momento che il 10
in realtà non lo fanno nulla. In realtà,
10;
è un perfettamente valido, anche se non molto utile, economico c, qualcosa che la maggior parte delle persone non capiscono fino a quando si arriva a conoscere meglio la lingua.
Tuttavia, v'è una differenza tra queste due affermazioni:
while ( 10, 1) { ... }
while (x=10, 1) { ... }
C'è un effetto collaterale in quest'ultimo uso dell'operatore virgola che deve impostare la variabile x
a 10
.
Sul motivo per cui non amano gli effetti collaterali nelle espressioni costanti, l'intero punto delle espressioni costanti è che possono essere valutati in fase di compilazione senza richiedere un ambiente di esecuzione - ISO distingue tra traduzione (tempo di compilazione) e ambienti di esecuzione (runtime).
L'indizio sul perché ISO decise di richiedere compilatori per fornire informazioni ambiente di esecuzione (diverso da cose contenute nei file di intestazione, come limits.h
) si può trovare un po 'più tardi nel documento logica:
Tuttavia, mentre le implementazioni sono certamente consentite per produrre esattamente lo stesso risultato negli ambienti di traduzione e di esecuzione, richiedendo che ciò fosse ritenuto un onere intollerabile per molti cross-compilatori.
In altre parole, ISO non voleva che i produttori di cross-compilatori fossero gravati da un ambiente di esecuzione per ogni possibile obiettivo.
Grazie Rossel. Ora il testo ha una maggiore leggibilità. –
possibile duplicato di [Cosa fa l'operatore virgola \ ', \' do in C?] (Http://stackoverflow.com/questions/52550/what-does-the-comma-operator-do-in-c) –