Domanda

Mi sono imbattuto in questo frammento di codice 1

int return_printChar1()
{
    // code
    // oops! no return statement
}
int return_printChar2()
{
    // code
    return printf("Return");
}
int main()
{  
   int i;
   // some more code
   i = return_printChar2();
   if((return_printChar1(),i))
   {
      printf ("Gotcha");
   }
}

1: Questo non è un esempio di vita reale.

La mia domanda è "Il comportamento del frammento di codice è ben definito in C e C ++?"

La mia opinione:

In C il comportamento è ben definito perché 6.5.17 dice

L'operando sinistro di un operatore di virgola viene valutato come a vuoto espressione; C'è un punto di sequenza dopo la sua valutazione

In C ++ 03 il comportamento è ben definito perché 5.18 dice

Una coppia di espressioni separate da una virgola viene valutata da sinistra a destra e il valore dell'espressione sinistra è scartato.

Tuttavia C ++ 03 (nella sezione 6.6.3) lo dice anche

Fluire la fine di una funzione è equivalente a un ritorno senza valore; Ciò si traduce in un comportamento non definito in una funzione di rendimento del valore.

Allo stesso modo in c

Se il controllo raggiunge la fine (}) della funzione non vuota (tranne main()) Il comportamento non è definito.

Quindi prendendo in considerazione tutti questi punti non posso giudicare il comportamento reale. Cosa ne pensate?

PS: se pensi che la domanda sia inutile e hai cose migliori da fare, aiuta te stesso: D.

È stato utile?

Soluzione

Le specifiche C che ho (C99 TC3) dice

Se il} che termina una funzione viene raggiunta e il valore della chiamata viene utilizzata dal chiamante, il comportamento non è finanziato.

Viene scartato il valore di un'espressione che si dice "valutato come espressione vuota". Quindi, nel caso C, non esiste un comportamento indefinito. Potrebbe essere stato diverso nella vecchia C (alcuni dettagli sono, se ricordo bene).

La situazione per C ++ è leggermente diversa rispetto a C, poiché C ++ supporta oggetti di classe con costruttore e distruttori come valori di restituzione e farli funzionare su memoria non inizializzata non può funzionare bene. Forse questo ha contribuito alle diverse regole per C ++.

Altri suggerimenti

È un comportamento indefinito.

La valutazione dell'espressione sinistra si traduce nel flusso fuori dalla fine di una funzione di rendimento del valore senza reso. Solo perché il valore viene scartato non significa che la valutazione non sia mai avvenuta.

È chiaramente indefinito. C99 §6.3.2.2 dice: "(Un'espressione vuota viene valutata per i suoi effetti collaterali.)" Quindi la funzione viene valutata e flui fuori dall'estremità. Non c'è carta di prigione gratuita.

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