En C/C++ hay un orden fijo para la evaluación del parámetro de la función. Me refiero a lo que dicen las normas es de izquierda a derecha o de derecha a izquierda. Estoy obteniendo información confusa de los libros.
No, el orden de evaluación de parámetros de la función (y de dos sub-expresiones en cualquier expresión) es comportamiento no especificado en C y C++. En inglés simple eso significa que el parámetro de la izquierda se pudo evaluar primero, o podría ser el más correcto, y no se puede saber qué orden se aplica a un compilador en particular.
Ejemplo:
static int x = 0;
int* func (int val)
{
x = val;
return &x;
}
void print (int val1, int val2)
{
cout << val1 << " " << val2 << endl;
}
print(*func(1), *func(2));
Este código es muy mala. Se basa en el orden de evaluación de los parámetros de impresión. Imprimirá "1 1" (de derecha a izquierda) o "2 2" (de izquierda a derecha) y . No podemos saber qué. Lo único garantizado por el estándar es que ambas llamadas a func() se completan antes de la llamada a print().
La solución a esto es tener en cuenta que la orden no está especificada, y escribir programas que no dependen del orden de evaluación. Por ejemplo:
int val1 = *func(1);
int val2 = *func(2);
print(val1, val2); // Will always print "1 2" on any compiler.
¿Es necesario que la función de llamada debe ser implementado utilizando únicamente la pila. ¿Qué dice C/C++ estándares sobre esto?
Esto se conoce como "convención de llamadas" y nada que el estándar especifique en absoluto. Cómo se pasan los parámetros (y los valores de retorno) depende completamente de la implementación. Se podrían pasar en los registros de la CPU o en la pila, o de alguna otra manera. La persona que llama podría ser la responsable de presionar/hacer saltar los parámetros en la pila, o la función podría ser responsable.
El orden de evaluación de los parámetros de la función solo está asociado de algún modo con la convención de llamada, ya que la evaluación se produce antes de llamar a la función. Pero, por otro lado, ciertos compiladores pueden optar por poner el parámetro más a la derecha en un registro de CPU y el resto de ellos en la pila, como un ejemplo.
Las normas no especifican la misma. El orden podría incluso cambiar aleatoriamente en el tiempo de ejecución (pero ninguna implementación lo hace, AFAIK). –
Nota pequeña: podría pensar que una coma es un punto de secuencia, lo que obligaría a ordenar de izquierda a derecha. Pero el operador de coma es un punto de secuencia, no la coma que separa los parámetros de función. – ugoren
Si confía en él, entonces su código puede ser difícil de leer, razonar y mantener. –