¿Por qué ‘return’, ‘continue’ o ‘break’ no funcionan con el operador de coma?

4 minutos de lectura

Avatar de usuario de Nayem
Nayem

Puedo escribir el código if(1) x++, y++; en vez de if(1) {x++; y++;}, pero en algunos casos no funciona (ver más abajo). Sería bueno que me cuentes sobre esto.

int x = 5, y = 10;    
if (x == 5) x++, y++;  // It works

if (x == 5) x++, return 0; // It shows an error

Lo mismo se aplica a for bucles:

for (int i = 0; i < 1; i++) y++, y += 5; // It works

for (int i = 0; i < 1; i++) y++, break; // Does not work

  • Necesitas aprender la diferencia entre expresiones y declaraciones.

    – Un tipo programador

    21 de agosto de 2018 a las 6:40

  • También tenga en cuenta que el uso la coma expresión la forma en que tiende a hacer que el código sea más difícil de leer, comprender y mantener.

    – Un tipo programador

    21 de agosto de 2018 a las 6:42

  • Porque no es así como se define la sintaxis del operador coma… y eso es todo.

    – Lundin

    21 de agosto de 2018 a las 6:54

  • Por la misma razón que int i = break; No funciona.

    – Peter – Reincorporar a Mónica

    21 de agosto de 2018 a las 15:09


  • ¿Por qué quieres hacer esto? Solo usa llaves. Es mucho más claro y sencillo de entender.

    – Nic

    21 de agosto de 2018 a las 20:23

Avatar de usuario de Rakete1111
Rakete1111

Eso es porque return y break son declaraciones, no expresiones. Como tal, no puede usarlo en otra expresión de ninguna manera. if y los otros son igualmente también declaraciones.

Sin embargo, lo que puede hacer es reescribir su expresión (por return) para que no esté anidado en una expresión, no es que recomiende escribir código como ese:

return x++, 0;

no puedes hacer eso por break porque no acepta una expresión.

  • Un buen ejemplo: no hay una diferencia sintáctica apreciable entre x++ / 7 y x++, 7 (ambas cosas / y , ser operadores). De la misma manera, x++, break tiene tanto sentido como x++ / break: ninguno en absoluto.

    – Amadan

    21 de agosto de 2018 a las 6:47

  • @Amadan ¡Buena ilustración! Estoy seguro de que lo usaré la próxima vez que tenga que explicar esto 🙂 Gracias

    – Rakete1111

    21 de agosto de 2018 a las 6:49


  • @Amadan Hay una diferencia muy significativa (al menos antes de C ++ 17, no estoy seguro de las nuevas reglas): el operador de coma induce una relación que sucede antes (o en términos antiguos, introduce un punto de secuencia), lo que significa que x++, x++ se define, mientras que x++ / x++ es indefinido.

    – Sebastián Redl

    21 de agosto de 2018 a las 7:56

  • @SebastianRedl: También está el hecho de que , devuelve el segundo operando, pero / divide las cosas, lo que diría que es una diferencia un poco más significativa: D. Sin embargo, sintácticamente, lo único que los hace diferentes es la precedencia (simplificado aquí, mas realista aqui).

    – Amadan

    21 de agosto de 2018 a las 8:05


  • PERO no lo hagas por favor

    – edc65

    21 de agosto de 2018 a las 13:39

Avatar de usuario de Yunnosch
Yunnosch

El operador coma es para expresiones.

los return enunciado y otros enunciados puros no son expresiones.

  • ¿Y la conclusión?

    -Peter Mortensen

    21 de agosto de 2018 a las 15:03

  • @PeterMortensen Respondí el “¿Por qué?” pregunta, ¿no? ¿Cuál es tu punto?

    – Yunnosch

    21 de agosto de 2018 a las 15:48

Avatar de usuario de David Dubois
david dubois

El operador coma es un operador binario que toma dos valores. De esta manera es lo mismo que + o *. Mientras + suma dos valores y devuelve el resultado, y * multiplica dos valores y devuelve el resultado, el operador de coma simplemente ignora el valor de la izquierda y devuelve el valor de la derecha.

2 + 5 tiene valor 7

2 * 5 tiene valor 10

2 , 5 tiene valor 5simplemente el operando a la derecha del operador.

Y entonces no puedes escribir 2,break por la misma razón que no puedes escribir 2+break. Porque break es una declaración, no un valor.

¿De qué sirve un operador binario que ignora uno de sus operandos? El operador de coma ignora el valor del operando izquierdo, pero la expresión aún se evalúa. Cualquier efecto secundario de esa expresión todavía se realiza. Considerar:

i = 2;
j = 5;
i++, j++;

Primero se evalúan las dos expresiones. i++ devuelve el valor 2y luego incrementa i. j++ devuelve el valor 5y luego incrementa j. Finalmente se aplica el operador coma a estos dos valores: 2,5 que ignora la 2 y devuelve el 5.

  • No creo que ignore el valor de la izquierda, pero en realidad evalúa la expresión de la izquierda y devuelve la expresión de la derecha.

    – Thomas Matthews

    21 de agosto de 2018 a las 18:42

  • Sí, evalúa la expresión, … y luego ignora su valor. He editado para que quede más claro. Gracias.

    –David Dubois

    21 de agosto de 2018 a las 19:23

  • Nayem, ¿fue esto útil en absoluto?

    –David Dubois

    22 de septiembre de 2018 a las 12:31


  • @DavidDubois ¿Por qué todos dicen break es una declaración? ¡No lo es! break; es. (Lo siento, solo estoy siendo pedante 🙂

    – LF

    28 de marzo de 2019 a las 14:21

  • LF, tienes razón. ¿Cómo llenarías el espacio en blanco? ‘break’ es un ____, no un valor.

    –David Dubois

    28 de marzo de 2019 a las 16:03

¿Ha sido útil esta solución?