Tutti gli argomenti sono valutati. Ordine non definito (come da standard). Ma tutte le implementazioni di C/C++ (che io sappia) valutano gli argomenti delle funzioni da da destra a sinistra. MODIFICA: CLang è un'eccezione (vedi commento sotto).
Credo che l'ordine di valutazione da destra a sinistra sia stato molto vecchio (dai primi compilatori C). Certamente prima che il C++ venisse inventato, la maggior parte delle implementazioni del C++ manterrebbe lo stesso ordine di valutazione perché le implementazioni C++ iniziali semplicemente tradotte in C.
Ci sono alcuni motivi tecnici per valutare gli argomenti della funzione da destra a sinistra. Nelle architetture stack, gli argomenti vengono generalmente inseriti nello stack. In C/C++, puoi chiamare una funzione con più argomenti di quelli effettivamente specificati - gli argomenti extra vengono semplicemente ignorati. Se gli argomenti vengono valutati da sinistra a destra e spostati da sinistra a destra, lo slot di stack subito sotto il puntatore dello stack manterrà l'ultimo argomento e non è possibile per la funzione ottenere l'offset di un particolare argomento (perché il numero effettivo di argomenti spinti dipende dal chiamante).
In un ordine push da destra a sinistra, lo slot di stack posto proprio sotto il puntatore dello stack mantiene sempre il primo argomento e lo slot successivo mantiene il secondo argomento, ecc. Gli offset degli argomenti saranno sempre deterministici per la funzione (che può essere scritto e compilato altrove in una biblioteca, separatamente da dove è chiamato).
Ora, l'ordine push da destra a sinistra non richiede un ordine di valutazione da destra a sinistra, ma nei primi compilatori la memoria scarseggia. Nell'ordine di valutazione da destra a sinistra, lo stesso stack può essere utilizzato sul posto (in sostanza, dopo aver valutato l'argomento - che può essere un'espressione o una chiamata funciton!), Il valore di ritorno è già nella posizione corretta sul pila). Nella valutazione da sinistra a destra, i valori degli argomenti devono essere memorizzati separatamente e reinseriti nello stack in ordine inverso.
fonte
2011-03-22 12:10:50
Provalo tu stesso con diversi compilatori? – strager
Mi sono posto la stessa domanda mentre implementavo un interprete per un sottoinsieme di C++. Uff. –
Si noti che 'foo (i ++, i ++)' richiama il comportamento non definito, perché 'i' viene incrementato di più di uno senza alcun punto di sequenza intermedio. – Nawaz