Ejecución de parámetros en la función printf () en lenguaje de progtwigción C

Mientras resolvía algunas preguntas de aptitud sobre el lenguaje de progtwigción C y me encontré con un problema en el que tengo que decir el resultado. El progtwig es: –

#include int main() { int x = 5; printf("%d %d %d", ++x, x++, ++x); return 0; } 

Ahora, por mi conocimiento anterior, sé que los parámetros de una printf() se evalúan de derecha a izquierda. Así que resolviendo esto manualmente estoy obteniendo salida como: – 8 6 6

Pero cuando compilé este progtwig obtuve la salida como: – 8 6 8

Bueno, aquí está la pregunta que parece estar relacionada con esta pregunta, pero allí estoy pidiendo específicamente la ejecución de parámetros en la función, no para los operadores de asignación.

¿O es que la ejecución de parámetros ocurre al azar? Si es así, entonces, en algún momento, debería dar una salida diferente pero no está dando. Incluso en diferentes comstackdores da el mismo resultado que 8 6 8.

¿Por qué esta anomalía?

Gracias

El orden de evaluación en printf() no es de izquierda a derecha como asumió. El orden de evaluación no está especificado :

Desde el borrador de C11 (Anexo J, conductas no especificadas)

El orden en el cual el designador de la función, los argumentos y las subexpresiones dentro de los argumentos se evalúan en una llamada a la función (6.5.2.2).

De, 3.4.4, comportamiento no especificado.

Uso de un valor no especificado, u otro comportamiento donde esta Norma Internacional proporciona dos o más posibilidades y no impone requisitos adicionales sobre los que se elija en ningún caso.

EJEMPLO Un ejemplo de comportamiento no especificado es el orden en que se evalúan los argumentos de una función.

Así que las tres expresiones x++ pueden ser evaluadas en cualquier orden. Pero esto conduce a un comportamiento indefinido ya que intenta modificar el mismo objeto más de una vez sin un punto de secuencia intermedio. La coma en un designador de función es un separador , no el operador de coma . Porque el operador de coma introduce un punto de secuencia entre sus operandos.

El comportamiento es definitivamente inesperado. No se supone que deba cambiar el valor de una variable más de una vez en una llamada de función. Reglas de puntos de secuencia. Intenta mirar este enlace . Y también leer sobre puntos de secuencia en un progtwig.

Simplemente intente no cambiar el valor de una variable más de una vez en una llamada de función

Hay dos cosas que interfieren aquí:

  • el orden de evaluación de los argumentos de la función es indefinido (lo que genera resultados indefinidos) -> el orden puede ser cualquier cosa porque no hay un orden impuesto por el Estándar (el estándar dice: el orden no está especificado)
  • no hay puntos de secuencia entre las evaluaciones de los argumentos de la función. (la función que llama per se, y su retorno son puntos de secuencia, pero eso es irrelevante aquí)

Lo que esto significa en la práctica: debido a que la evaluación de los argumentos de la función tiene efectos secundarios (los incrementos), hay múltiples bashs de alterar el valor de x sin un punto de secuencia intermedio, lo que provoca un comportamiento indefinido.