Dentro de un bucle while, es la última coma declaración garantiza que funcionan última separado?

StackOverflow https://stackoverflow.com/questions/4072578

Pregunta

Considere el siguiente segmento de código (trivial):

while (i++, i <= 10) {
  // some more code
}

En el caso general, C ++ permite coma declaraciones para ser evaluados en cualquier orden separó. En el caso de un tiempo de bucle, son que al menos garantizada (por la especificación) que la última instrucción (que se utiliza como la condición para el bucle) se evaluará pasado?

¿Fue útil?

Solución

  

En el caso general, C ++ permite coma declaraciones para ser evaluados en cualquier orden separó.

Si se refiere a las comas entre los argumentos de la función, que es sólo un separador.

En su caso, usted está utilizando el operador coma , y que introduce una secuencia de punto que garantiza que todos los efectos secundarios de la coma operando izquierdo se han establecido antes de evaluar la correcta.

Así que sí, es bien definido.

Desde la sección de 5,18 / 1 de la ISO C ++ 98 estándar:

  

Un par de expresiones separados por una coma se evalúa de izquierda a derecha y el valor de la expresión izquierda se descarta. El rvalue lvalue-a-(4.1), array-a-puntero (4,2), y la función-a-puntero (4.3) conversiones estándar no se aplican a la expresión izquierda. Todos los efectos secundarios (1,9) de la expresión izquierda, a excepción de la destrucción de provisionales (12.2), se llevan a cabo antes de la evaluación de la expresión de la derecha. El tipo y la   valor del resultado son el tipo y el valor del operando de la derecha; el resultado es un valor-i si su operando derecho es.

Otros consejos

Sí. El operador , (a menos sobrecargado!) Introduce un llamado punto secuencia y garantice efectivamente el orden de ejecución de izquierda a derecha.

Los comentarios anteriores se explicó. Y uno de la manera común de abusar de este método es

while(scanf("%d", &n), n){
    // do something
}

Esto permitirá la lectura número entero hasta que leer cero.

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