2010-11-01 20 views
11

Considérese el siguiente (trivial) segmento de código:Dentro de un ciclo while, ¿se garantiza que la última declaración separada por comas se ejecutará la última vez?

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 ciclo while, ¿estamos al menos garantizados (según la especificación) que la última declaración (que se usa como condición para el ciclo) se evalúa al final?

+6

Supongo que esto está fuera de tu punto, pero por las dudas: podrías reescribir esa condición como 'i ++ <= 10' y deshacerte del operador de coma. Ahora ve y dime que esto está fuera de tu punto. ':)' – sbi

+6

@sbi - ¿Eso hace lo mismo? Lo hubiera esperado con el prefijo pero no con postfix. es decir. '++ i, i <= 10' es lo mismo que' ++ i <= 10' –

+0

@Steve: Me tienes allí. Sí, debería ser '++ i <= 10'. Lo siento por eso. (Realmente no debería intentar hacer eso mientras [chateando] (http://chat.stackoverflow.com/rooms/10/c-lounge).) – sbi

Respuesta

16

En el caso general, C++ permite que las declaraciones separadas por comas se evalúen en cualquier orden.

Si se refiere a las comas entre los argumentos de funciones, eso es solo un separador.

En su caso, está usando el operador de coma , y eso introduce un punto de secuencia que garantiza que todos los efectos secundarios del operando izquierdo de la coma se hayan establecido antes de evaluar el correcto.

Así que sí, está bien definido.

Desde la sección 5.18/1 de la norma 98 de la ISO C++:

Un par de expresiones separadas por una coma se evalúa de izquierda a derecha y el valor de la expresión izquierda se descarta. Las conversiones estándar lvalue-to-rvalue (4.1), array-to-pointer (4.2) y function-to-pointer (4.3) no se aplican a la expresión izquierda. Todos los efectos secundarios (1.9) de la expresión izquierda, excepto la destrucción de los temporales (12.2), se realizan antes de la evaluación de la expresión correcta. El tipo y el valor del resultado son el tipo y el valor del operando correcto; el resultado es un lvalue si su operando derecho es.

11

Sí. El operador , (¡a menos que esté sobrecargado!) Introduce el llamado punto de secuencia y de hecho garantiza el orden de ejecución de izquierda a derecha.

+3

... y notablemente el contexto (como en la condición 'while') no tiene importancia para la afirmación anterior . – dmckee

1

Los comentarios anteriores lo explicaron. Y una de las formas comunes 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.

Cuestiones relacionadas