una tipos sintomas sesion secundarios qué quimioterapia que primera hacer funciona efectos duran duele despues cuanto cuando c++ c++11

c++ - tipos - qué es la quimioterapia y sus efectos secundarios



¿Qué es exactamente un ''efecto secundario'' en C++? (4)

¿Qué es exactamente un ''efecto secundario'' en C ++? ¿Es un término estándar que está bien definido ...

c ++ 11 draft - 1.9.12: Acceder a un objeto designado por un glvalue volátil (3.10), modificar un objeto, llamar a una función de E / S de la biblioteca o llamar a una función que realiza cualquiera de esas operaciones son todos efectos secundarios, que Son cambios en el estado del entorno de ejecución. La evaluación de una expresión (o una subexpresión) en general incluye tanto los cálculos de valores (incluida la determinación de la identidad de un objeto para la evaluación de glvalue como la obtención de un valor previamente asignado a un objeto para la evaluación de prvalue) y el inicio de los efectos secundarios. Cuando se devuelve una llamada a una función de E / S de la biblioteca o se evalúa el acceso a un objeto volátil, el efecto secundario se considera completo, aunque algunas acciones externas implícitas en la llamada (como la propia E / S) o el acceso volátil puede que no se haya completado todavía.

Encontré una definición aquí, pero ¿esto no hace que cada declaración de código sea un efecto secundario?

Un efecto secundario es el resultado de un operador, expresión, declaración o función que persiste incluso después de que el operador, expresión, declaración o función haya terminado de ser evaluado.

¿Puede alguien explicar por favor lo que significa formalmente el término "efecto secundario" en C ++ y cuál es su significado?

El significado es que, a medida que se evalúan las expresiones, pueden modificar el estado del programa y / o realizar I / O. Se permiten expresiones en innumerables lugares en C ++: asignaciones de variables, condiciones if / else / while , pasos de configuración / prueba / modificación de bucle, parámetros de función, etc. Un par de ejemplos: ++x y strcat(buffer, "append this") .

En un programa C ++, el Estándar otorga al optimizador el derecho a generar código que representa las operaciones del programa, pero requiere que todas las operaciones asociadas con los pasos antes de un punto de secuencia aparezcan antes de cualquier operación relacionada con los pasos posteriores al punto de secuencia.

La razón por la que los programadores de C ++ tienden a tener que preocuparse por los puntos de secuencia y los efectos secundarios es que no hay tantos puntos de secuencia como podría esperarse. Por ejemplo: dado x = 1; f(++x, ++x); x = 1; f(++x, ++x); , puede esperar una llamada a f(2, 3) pero en realidad es un comportamiento indefinido. Este comportamiento queda sin definir, por lo que el optimizador del compilador tiene más libertad para organizar operaciones con efectos secundarios para que se ejecuten en el orden más eficiente posible, tal vez incluso en paralelo. También evita cargar a los escritores de compiladores con la detección de tales condiciones.

1.¿Es el operador de coma libre de efectos secundarios?

Sí, un operador de coma introduce un punto de secuencia: los pasos de la izquierda deben completarse antes de que se ejecuten los de la derecha. Hay una lista de puntos de secuencia en http://en.wikipedia.org/wiki/Sequence_point . ¡Debería leer esto! (Si tiene que preguntar acerca de los efectos secundarios, tenga cuidado al interpretar esta respuesta: el "operador de coma" NO se invoca entre los argumentos de la función, los elementos de inicialización de la matriz, etc. El operador de la coma se usa relativamente poco y es algo oscuro. Lea un poco. Si no estás seguro de lo que realmente es el operador de coma.)

2.Fuerza el compilador para no optimizar las declaraciones sin efectos secundarios

Supongo que te refieres a declaraciones "de efectos colaterales". El compilador no está obligado a apoyar ninguna de estas opciones. ¿Qué comportamiento exhibirían si lo intentaran? - El Estándar no define qué deben hacer en tales situaciones. A veces, la mayoría de los programadores pueden compartir una expectativa intuitiva, pero otras veces es realmente arbitrario.

3. Efectos secundarios al pasar objetos para funcionar en C ++

Al llamar a una función, todos los parámetros deben haber sido evaluados por completo, y se deben activar sus efectos secundarios, antes de que se realice la llamada a la función. PERO, no hay restricciones en el compilador relacionado con la evaluación de expresiones de parámetros específicos antes que cualquier otra. Pueden estar superpuestas, en paralelo, etc. Entonces, en f(expr1, expr2) , algunos de los pasos en la evaluación de expr2 pueden ejecutarse antes que cualquier cosa desde expr1, pero expr1 aún puede completarse primero, es indefinido .

¿Es un término estándar que está bien definido, o simplemente un término acuñado por los desarrolladores para explicar un concepto (.. y cuál es el concepto)? Según tengo entendido, esto tiene algo que ver con los puntos de secuencia confusos, pero no estoy seguro.

Encontré una definición here , pero ¿esto no hace que cada declaración de código sea un efecto secundario?

Un efecto secundario es el resultado de un operador, expresión, declaración o función que persiste incluso después de que el operador, expresión, declaración o función haya terminado de ser evaluado.

¿Puede alguien explicar por favor lo que significa formalmente el término "efecto secundario" en C ++ y cuál es su significado?

Para referencia, algunas preguntas que hablan sobre los efectos secundarios:

  1. ¿El operador de coma está libre de efectos secundarios?
  2. Forzar al compilador a no optimizar las declaraciones sin efectos secundarios
  3. Efectos secundarios al pasar objetos para funcionar en C ++.

1.9.6

El comportamiento observable de la máquina abstracta es su secuencia de lecturas y escrituras en datos volatile y llamadas a las funciones de E / S de la biblioteca.

Un efecto secundario es cualquier cosa que afecta el comportamiento observable.

Tenga en cuenta que hay excepciones especificadas por el estándar, donde el comportamiento observable no tiene que ajustarse al de la máquina abstracta; consulte la optimización del valor de retorno, la resolución de copia temporal.


El término "efecto secundario" surge de la distinción entre lenguajes imperativos y lenguajes puramente funcionales. Una expresión de C ++ puede hacer tres cosas:

  1. calcular un resultado (o calcular "ningún resultado" en el caso de una expresión void ),
  2. generar una excepción en lugar de evaluar un resultado,
  3. además de 1 o 2, de lo contrario altere el estado de la máquina abstracta en la que el programa se está ejecutando nominalmente.

(3) son efectos secundarios, el "efecto principal" es evaluar el resultado de la expresión. Las excepciones son un caso especial ligeramente incómodo, ya que alterar el flujo de control cambia el estado de la máquina abstracta (al cambiar el punto actual de ejecución), pero no es un efecto secundario. El código para construir, manejar y destruir la excepción puede tener sus propios efectos secundarios, por supuesto.

Los mismos principios se aplican a las funciones, con el valor de retorno en lugar del resultado de la expresión.

Entonces, int foo(int a, int b) { return a + b; } int foo(int a, int b) { return a + b; } solo calcula un valor de retorno, no altera nada más. Por lo tanto, no tiene efectos secundarios, que a veces es una propiedad interesante de una función cuando se trata de razonar sobre su programa (por ejemplo, para demostrar que es correcto, o por el compilador cuando se optimiza). int bar(int &a, int &b) { return ++a + b; } int bar(int &a, int &b) { return ++a + b; } tiene un efecto secundario, ya que modificar el objeto de la persona que llama es un efecto adicional de la función más allá de simplemente calcular un valor de retorno. No estaría permitido en un lenguaje funcional puro.

El contenido de su cita sobre "ha terminado de evaluarse" se refiere al hecho de que el resultado de una expresión (o el valor de retorno de una función) puede ser un "objeto temporal", que se destruye al final de la expresión completa en la que se produce Así que crear un temporal no es un "efecto secundario" según esa definición: otros cambios lo son.


Un "efecto secundario" está definido por el estándar C ++ en [intro.execution] , por:

Leer un objeto designado por un glvalue volátil (3.10), modificar un objeto, llamar a una función de E / S de la biblioteca o llamar a una función que realiza cualquiera de esas operaciones son todos efectos secundarios, que son cambios en el estado del entorno de ejecución.