Scusate se questa domanda è ingenua. Considera il seguente programma:
#include <stdio.h>
int main() {
int i = 1;
i = i + 2;
5;
i;
printf("i: %d\n", i);
}
Nell'esempio di cui sopra, le dichiarazioni 5;e i;sembrano del tutto superfluo, ma il codice viene compilato senza avvisi o errori di default (tuttavia, gcc fa lanciare un warning: statement with no effect [-Wunused-value]avviso quando correva con -Wall). Non hanno alcun effetto sul resto del programma, quindi perché vengono considerate dichiarazioni valide in primo luogo? Il compilatore semplicemente li ignora? Ci sono dei vantaggi nel consentire tali dichiarazioni?
;dopo. Sarebbe complicato il linguaggio aggiungere ulteriori regole su quando le espressioni non possono essere dichiarazioni
printf()? L'istruzione 5;dice sostanzialmente "fai tutto ciò che 5non fa (nulla) e ignora il risultato. La tua dichiarazione printf(...)è" fai tutto ciò che printf(...)fa e ignora i risultati (il valore restituito da printf()) ". C considera quelli uguali. Ciò consente anche il codice come (void) i;dove si itrova un parametro per una funzione a cui è stato eseguito il cast per voidcontrassegnarlo come deliberatamente inutilizzato.
printf()ha un effetto, anche se ignori il valore che alla fine restituisce. Al contrario, 5;non ha alcun effetto.