31 votos

Efecto del uso de una coma en lugar de un punto y coma en C y C++

Me he dado cuenta en varias ocasiones cuando la refactorización de varias piezas de código C y C++ que se utiliza una coma en lugar de punto y coma para separar las declaraciones. Algo como esto;

int a = 0, b = 0;
a = 5, b = 5;

Donde yo esperaba

int a = 0, b = 0;
a = 5; b = 5;

Sé que C y C++ permiten el uso de comas para separar las declaraciones (en particular bucle encabezados), pero ¿cuál es la diferencia si alguna entre estas dos piezas de código? Mi conjetura es que la coma se ha dejado como resultado de cortar y pegar, pero es un error y lo hace efecto la ejecución?

54voto

Frank Puntos 6174

No hacer una diferencia en el código que has publicado. En general, la coma separa expresiones sólo como un punto y coma, sin embargo, si usted toma todo como una expresión, entonces el operador coma significa que la expresión se evalúa como el último argumento.

He aquí un ejemplo:

b = (3,5);

Evaluará 3, luego 5 y asignar el último a b. Por lo tanto, b==5. Tenga en cuenta que los soportes son importantes aquí:

b = 3, 5;

Evaluará b=3, luego 5 y el resultado de la expresión completa es de 5, sin embargo b == 3.

El operador coma es especialmente útil para los bucles cuando el iterador de código no es una simple i++, pero lo que usted necesita hacer varios comandos. En ese caso, un punto y coma no funciona bien con el lazo de la sintaxis.

12voto

x4u Puntos 7436

La coma es un operador que devuelve un valor que siempre es el 2 º argumento (derecha) mientras que un punto y coma termina sólo declaraciones. Permite que el operador coma para ser utilizada dentro de otras declaraciones o para concatenar varias declaraciones para aparecer como uno.

Aquí se llama la función f (x) y entonces x > y se evalúa para el if instrucción.

if( y = f(x), x > y )

Un ejemplo cuando se utiliza sólo para evitar una necesidad para el bloque

if( ... )
   x = 2, y = 3;

if( ... ) {
   x = 2;
   y = 3;
}

4voto

UncleBens Puntos 24580

El operador coma evalúa todos los operandos de izquierda a derecha, y el resultado es el valor de la última operando.

Es útil sobre todo para bucles si quieres hacer varias acciones en el "incremento" de la parte, e.g (invertir una cadena)

for (int lower = 0, upper = s.size() - 1; lower < upper; ++lower, --upper)
    std::swap(s[lower], s[upper]);

Otro ejemplo, donde podría ser una opción (encontrar todas las apariciones de una cadena):

#include <string>
#include <iostream>

int main()
{
    std::string s("abracadabra");
    size_t search_position = 0;
    size_t position = 0;

    while (position = s.find('a', search_position), position != std::string::npos) {
        std::cout << position << '\n';
        search_position = position + 1;
    }
}

En particular, la lógica y no puede ser utilizada para esta condición, ya que tanto el cero y el cero no puede significar que el personaje no se encuentra en la cadena. Con coma, por otro lado, position = s.find() es llamado cada vez que cuando se evalúa la condición, pero el resultado de esta parte de la condición sólo es ignorado.

Naturalmente, hay otras formas de escribir el bucle:

while ((position = s.find('a', search_position)) != std::string::npos)

o simplemente

while (true) {
    position = s.find('a', search_position);
    if (position == std::string::npos)
        break;
    ...
}

2voto

catwalk Puntos 3508

sería un uso en código de golf:

if(x==1)y=2,z=3;
if(x==1){y=2;z=3;}

la primera línea es más corta, pero que parece demasiado confusa usar en el desarrollo normal

2voto

Michael Burr Puntos 181287

Como Frank menciona, cómo el operador coma se utiliza en su ejemplo, no causa un error. El operador coma puede ser confuso, por varias razones:

  • no se ve muy a menudo, ya que sólo es necesario en algunas situaciones especiales
  • hay varios otros sintáctica de los usos de la coma que puede verse como un operador coma, pero no son (las comas que se utiliza para separar los parámetros de la función y argumentos, las comas que se utiliza para separar las declaraciones de variables o inicializadores)

Ya que es confuso y a menudo innecesarias, el operador coma debe ser evitado, excepto para algunas situaciones muy específicas:

  • puede ser útil para realizar múltiples de la operación en uno o más de un for declaración del control de las expresiones
  • puede ser utilizado en las macros del preprocesador para evaluar más de una expresión en una sola instrucción. Esto se hace generalmente para permitir una macros para hacer más de una cosa y aun así ser una sola expresión para la macro 'ajuste' en lugares que sólo permiten una expresión.

El operador coma es un hackish operador prácticamente por definición - es para hackear en 2 cosas en las que sólo se permite. Casi siempre es feo, pero a veces eso es todo lo que tienes. Y esa es la única vez que usted debe usar si usted tiene otra opción, no utilizar el operador coma.

La parte superior de mi cabeza no puedo pensar en muchas otras razones para utilizar el operador, ya que se puede obtener un efecto similar por la evaluación de las expresiones en declaraciones separadas en la mayoría de otras situaciones (aunque estoy seguro de que alguien va a comentar sobre un otro uso que he pasado por alto).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X