Todos los argumentos son evaluados Orden no definida (según el estándar). Pero todas las implementaciones de C/C++ (que yo sepa) evalúan los argumentos de función desde de derecha a izquierda. EDITAR: CLang es una excepción (ver comentario a continuación).
Creo que el orden de evaluación de derecha a izquierda ha sido muy muy antiguo (desde los primeros compiladores de C). Ciertamente, mucho antes de que se inventara C++, y la mayoría de las implementaciones de C++ mantendrían el mismo orden de evaluación porque las primeras implementaciones de C++ simplemente se tradujeron en C.
Existen razones técnicas para evaluar los argumentos de las funciones de derecha a izquierda. En las arquitecturas de pila, los argumentos generalmente se insertan en la pila. En C/C++, puede llamar a una función con más argumentos de los que realmente se especificaron: los argumentos adicionales se ignoran simplemente. Si los argumentos se evalúan de izquierda a derecha y se presionan de izquierda a derecha, la ranura de la pila justo debajo del puntero de la pila contendrá el último argumento, y no hay forma de que la función obtenga el desplazamiento de un argumento en particular (porque la cantidad real de argumentos empujados depende de la persona que llama).
En una orden de inserción de derecha a izquierda, la ranura de pila justo debajo del puntero de pila siempre mantendrá el primer argumento, y la siguiente ranura contendrá el segundo argumento, etc. Las compensaciones de argumento siempre serán determinísticas para la función (que puede escribirse y compilarse en otra parte en una biblioteca, por separado de donde se llame).
Ahora, la orden de inserción de derecha a izquierda no ordena la orden de evaluación de derecha a izquierda, pero en los primeros compiladores, la memoria es escasa. En el orden de evaluación de derecha a izquierda, la misma pila se puede utilizar en el lugar (esencialmente, después de evaluar el argumento, que puede ser una expresión o una llamada de función), el valor de retorno ya está en la posición correcta en el apilar). En la evaluación de izquierda a derecha, los valores del argumento se deben almacenar por separado y se deben volver a la pila en orden inverso.
Pruébelo usted mismo con diferentes compiladores? – strager
Me hice la misma pregunta al implementar un intérprete para un subconjunto de C++. Uf. –
Tenga en cuenta que 'foo (i ++, i ++)' invoca un comportamiento indefinido, porque 'i' se incrementa más de uno sin intervenir ningún punto de secuencia. – Nawaz