2009-11-07 11 views
9

leí sobre 'efecto secundario' de this website:por qué "f = f ++" no es seguro en c?

pero todavía no entiendo por qué f = f++ considerado inseguro?

¿Alguien puede explicarlo?

+0

duplicado (aunque no muy obvio si no lo hace saber la respuesta por qué) http://stackoverflow.com/questions/1678519/difference-between-i-and-i –

+1

También hay una pregunta en algún lugar sobre por qué "++ i ++" es ilegal, pero es imposible buscarlo. –

+3

Esta pregunta explícitamente pregunta por qué este constructo es inseguro.La pregunta a la que hace referencia tiene un código que no es válido, ya que este constructo no es seguro. Dos preguntas completamente válidas diferentes. – joshperry

Respuesta

16

El problema es Sequence Points. Hay dos operaciones en esta declaración sin punto de secuencia, por lo que no hay un orden definido para la declaración, ¿está la asignación primero o el incremento?

Nada dice que no es seguro, es sólo indefinido, lo que significa que las diferentes implementaciones pueden tener diferentes resultados o puede formatear el disco duro ...

+2

Creo que la mayoría de la gente consideraría formatear un disco como una consecuencia insegura de 'f = f ++'. Aunque creo que la mayoría de la gente dice "inseguro", no significa que pueda destruir algo, pero que no puede depender de lo que hará. –

+0

El estándar C y C++ utiliza de forma bastante explícita el término "Comportamiento no definido" en todo momento, y específicamente en la sección que detalla el orden de ejecución del punto de secuencia. Simplemente estaba usando una hipérbole para acentuar la diferencia entre inseguro e indefinido. – joshperry

+4

comportamiento no declarado implica código inseguro – hasen

4

Usando x y x++ (o ++x) dentro de la misma afirmación es comportamiento indefinido en C. El compilador puede hacer lo que quiera: aumentar x antes de realizar la tarea o después de eso. Tomando el código de Ólafur, podría generar f == 5 o f == 6, dependiendo de su compilador.

4

El artículo en el (cleaned up) link que proporcionó da la respuesta. "C casi no promete que los efectos secundarios ocurrirán en un orden predecible dentro de una sola expresión". Esto significa que usted no sabe en qué orden aparecerán el = y el ++. Es dependiente del compilador.

Si sigue el enlace de ese artículo al artículo sobre sequence points en el mismo sitio, verá que el compilador puede optimizar qué y cuándo escribe valores de los registros en las variables.

+0

Una aclaración adicional: no depende solo del compilador. Lo que el compilador puede hacer puede no tener ningún sentido, incluso hasta el punto de que 2 instancias de la misma declaración (con el mismo valor inicial para 'f') podrían producir resultados completamente diferentes. –

0

Apoyo la respuesta de Arthur a este respecto. Aunque la implementación del operador de incremento posterior es f ++ es confusa, no se considera insegura. U primero debe entender cómo lo interpreta el compilador. si aumentará f después de encontrar una terminación de oración (;) o inmediatamente después de usar el valor de f.

+1

* No definido *, en el sentido del estándar C. Este no es un caso de "usted debe saber lo que hace el compilador". El compilador puede hacer cualquier cosa, incluso dar un valor a f que no se corresponde con ninguno de los pedidos de las instrucciones atómicas que crees que tiene que generar. –

1

Desde el standard

6,5 (2) Si un efecto secundario en un objeto de escalar es unsequenced con relación a ya sea un efecto secundario diferente en el mismo objeto escalar o un cálculo de valor usando el valor de la misma escalar objeto, el comportamiento no está definido. Si hay varias ordenaciones permitidas de las subexpresiones de una expresión, el comportamiento no está definido si se produce un efecto de ese lado no secuenciado en cualquiera de los pedidos. 74)

74) Este párrafo renders expresiones de los estados no definidos como

 
      i = ++i + 1; 
      a[i++] = i; 

al tiempo que permite

 
      i = i + 1; 
      a[i] = i;