Operador de coma en condición de bucle en C

1 minuto de lectura

Operador de coma en condicion de bucle en C
Ravi Oja

#include <stdio.h>

main()
{
    int i;
    for(i=0; i<0, 5; i++)
        printf("%d\n", i);
}

soy incapaz de entender el i<0, 5 parte en el estado de for lazo.

Incluso si lo logro i>0, 5no hay cambios en la salida.

¿Como funciona esto?

  • El artículo vinculado dice “Debido a que el operador de coma descarta su primer operando, generalmente solo es útil cuando el primer operando tiene efectos secundarios deseables”.

    – anatolyg

    18/10/2012 a las 16:35

1647683466 338 Operador de coma en condicion de bucle en C
Mihai Stancu

En tema

El operador de coma siempre producirá el último valor en la lista separada por comas.

Básicamente es un operador binario que evalúa el valor de la izquierda pero lo descarta, luego evalúa el valor de la derecha y lo devuelve.

Si encadena varios de estos, eventualmente producirán el último valor en la cadena.

Según el comentario de anatolyg, esto es útil si desea evaluar el valor de la mano izquierda antes que el valor de la mano derecha (si la evaluación de la mano izquierda tiene un efecto secundario deseable).

Por ejemplo i < (x++, x/2) sería una forma sensata de usar ese operador porque está afectando el valor de la mano derecha con las repercusiones de la evaluación del valor de la mano izquierda.

http://en.wikipedia.org/wiki/Comma_operator

Nota al margen: ¿alguna vez has oído hablar de este curioso operador?

int x = 100;
while(x --> 0) {
    // do stuff with x
}

Es solo otra forma de escribir. x-- > 0.

  • Entonces, para ser claros, en el OP no hay diferencia entre usar i<0,5 e i<5 ya que el 0 solo se evalúa como 0 y no hace nada.

    – acrónimo

    18/10/2012 a las 16:41

  • El operador coma tiene la menor prioridad, por lo que i < x++, x/2 solo devolverá falso si x es 0 o 1. La comparación es redundante.

    – John Dvorak

    18/10/2012 a las 16:41

  • Precisamente, parece ingenioso, ¿no?

    – Mihai Stancu

    18/10/2012 a las 16:42

  • @Jan, estás asumiendo i se incrementa por 1. No es necesariamente el caso.

    – Mihai Stancu

    18/10/2012 a las 16:43

  • Aún así, ¿por qué usar i < (x++, x/2) cuando puedes usar i < ++x / 2

    – John Dvorak

    18/10/2012 a las 16:46


El operador de coma evalúa i<0 O i>0 e ignora. Por lo tanto, siempre es el 5 eso está presente en la condición.

Entonces es equivalente a:

for(i=0;5;i++)

  • Alguien comentó que esta respuesta es incorrecta. Ahora el comentario se ha ido y me quedo preguntándome quién es.

    – PP

    18/10/2012 a las 16:46

  • remanente desde el momento en que usted declaró que evalúa i>5, probablemente. No soy el votante negativo.

    – John Dvorak

    18/10/2012 a las 16:48

  • @JanDvorak tal vez, la confusión proviene de i<0 o i>0 .. Simplemente se pregunta OP, incluso si cambia la condición, todavía da el mismo resultado. Por eso agregué el for lazo.

    – PP

    18/10/2012 a las 17:04

  • Dado que aquellos que han comentado no votaron negativamente, agradecería si el votante negativo anónimo puede explicar su razón.

    – PP

    18/10/2012 a las 18:00

  • Eso es muy simple. La condición siempre es verdadera, es decir, es 5. Así que será un bucle infinito. C ª, 0 es falso, todo lo demás es verdadero. Entonces, si tienes for(i=0;1;i++) o for(i=0;-1;i++) todos son iguales y entrarán en un ciclo infinito a menos que tenga una declaración de interrupción dentro del ciclo 🙂

    – PP

    18/10/2012 a las 19:04


El operador de coma se realiza en la inicialización y en la parte de incremento, para hacer algo como for(i=0,j=20;i<j;i++,j--)si lo haces en la parte de comparación evaluará la última (como ya se respondió antes)

i<0,5 siempre evaluará a 5como siempre, se devolverá la expresión correcta para ex1,ex2 .

Operador de coma en condicion de bucle en C
mfsiega

El operador de coma está diseñado para casos en los que el primer operando tiene algunos efectos secundarios. Es solo una expresión idiomática, destinada a hacer que su código sea más legible. No tiene efecto en la evaluación del condicional.

Por ejemplo,

for (i = 0; i<(i++, 5); i++) {
    // something
}

incrementará iy luego verifique si i<5.

  • ¿Cuál es la prioridad relativa de < y , ¿otra vez? no creo que lo haga siempre evaluar i<5

    – John Dvorak

    18/10/2012 a las 16:39


  • @JanDvorak Correcto. el análisis es ((i < i++), 5)entonces i se compara con i++ (o no, el compilador puede reducir esa parte a simplemente i++), y el resultado siempre es 5.

    –Daniel Fischer

    18/10/2012 a las 16:41


  • De wikipedia (no lo he confirmado con un compilador) “el operador de coma tiene la precedencia más baja de cualquier operador C”

    – mfsiega

    18/10/2012 a las 16:42

  • @mfrankli Y eso significa que el < se une más fuerte que el ,entonces i < i++ es la primera expresión, 5 el segundo.

    –Daniel Fischer

    18/10/2012 a las 16:46

  • correcto, según la respuesta de Mihai Stancu, los padres son necesarios para que realmente tenga sentido. voy a actualizar fwiw

    – mfsiega

    18/10/2012 a las 16:51

  • ¿Cuál es la prioridad relativa de < y , ¿otra vez? no creo que lo haga siempre evaluar i<5

    – John Dvorak

    18/10/2012 a las 16:39


  • @JanDvorak Correcto. el análisis es ((i < i++), 5)entonces i se compara con i++ (o no, el compilador puede reducir esa parte a simplemente i++), y el resultado siempre es 5.

    –Daniel Fischer

    18/10/2012 a las 16:41


  • De wikipedia (no lo he confirmado con un compilador) “el operador de coma tiene la precedencia más baja de cualquier operador C”

    – mfsiega

    18/10/2012 a las 16:42

  • @mfrankli Y eso significa que el < se une más fuerte que el ,entonces i < i++ es la primera expresión, 5 el segundo.

    –Daniel Fischer

    18/10/2012 a las 16:46

  • correcto, según la respuesta de Mihai Stancu, los padres son necesarios para que realmente tenga sentido. voy a actualizar fwiw

    – mfsiega

    18/10/2012 a las 16:51

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad