Pregunta

¿Por qué se imprime la siguiente pieza del código C? 12 12 12

int main(int argc, char const *argv[]) {
  int a = 2, *f1, *f2;
  f1 = f2 = &a;
  *f2 += *f2 += a += 2.5;
  printf("%i %i %i\n", a, *f1, *f2);
  return 0;
}
¿Fue útil?

Solución

*f2 += *f2 += a += 2.5;

Esta línea tiene Comportamiento indefinido Porque cambias el valor de *f2(es decir a) más de una vez dentro de la misma expresión sin un punto de secuencia de intervención. UB significa que su programa puede imprimir "Hello World", puede bloquearse, puede imprimir 12 12 12 o 12 12 1029 O puede comenzar a comer tu cerebro. No confíes en el comportamiento indefinido.

Para citar el estándar C ++ (sé que la pregunta está etiquetada C, pero no tengo un estándar C por mí y sé que la misma regla se mantiene en c)

Excepto cuando se indique, el orden de evaluación de operandos de operadores individuales y subexpresiones de expresiones individuales, y el orden en el que tienen lugar los efectos secundarios, 53) entre el punto de secuencia anterior y siguiente un objeto escalar tendrá su valor almacenado modificado a lo sumo una vez por la evaluación de una expresión. Además, se accederá al valor anterior solo para determinar el valor a almacenar. Los requisitos de este párrafo se cumplirán para cada pedido permitido de las subexpresiones de una expresión completa; De lo contrario, el comportamiento es indefinido.

Otros consejos

Imprime el mismo valor para todos porque solo apunta a uno int variable: a.

Se imprime 12 porque a + 2.5 = 4 (a es un int), y luego lo agregas a sí mismo dos veces.


@Downvoters: ¿Por qué tan negativo? Creo que mi respuesta dice que este compilador está haciendo este código de ejemplo, que debería ayudar al OP a comprender el comportamiento. Estoy de acuerdo que Armen tsirunyanLa respuesta es correcta (es decir, debería obtener la marca) y que el el comportamiento no está definido de acuerdo con el estándar. Pero se implementan estándares, y aún no he visto un compilador que compile el código y luego, en tiempo de ejecución, de repente levante las manos y dice Undefined behaviour!.

yo porque *f2 y *f1 apunta a a (un entero).

Asi que *f2 = &a = 2 y *f1 = &a = 2

En este punto, agrega el valor de 2.5 (porque a es un entero, obtendrás 4).

De lo que tienes

a = 4
f2 = 4
f1 = 4

En este punto lo haces f2+f1+a = 12.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top