c++ c operators comma-operator

c++ - ¿Qué hace el operador de coma?



operators comma-operator (8)

¿Qué hace el siguiente código en C / C ++?

if (blah(), 5) { //do something }


El operador de coma se aplica y el valor 5 se usa para determinar el condicional verdadero / falso.

Ejecutará blah () y recuperará algo (presumiblemente), luego se empleará el operador de coma y 5 será lo único que se usará para determinar el valor verdadero / falso para la expresión.

Tenga en cuenta que el operador, podría estar sobrecargado para el tipo de devolución de la función blah () (que no se especificó), por lo que el resultado no es obvio.


En el caso patológico, depende de lo que haga el operador de coma ...

class PlaceHolder { }; PlaceHolder Blah() { return PlaceHolder(); } bool operator,(PlaceHolder, int) { return false; } if (Blah(), 5) { cout << "This will never run."; }


En una respuesta más amplia. El operador de coma (sin sobrecarga) se resuelve como en, ejecuta la primera parte y devuelve la segunda parte.

Entonces, si tiene (foo (), bar ()) Ambas funciones se ejecutarán, pero el valor de la expresión se evalúa como bar () (y el tipo de la expresión también).

Si bien no diré que hay usos justos para eso, generalmente se considera un código un poco difícil de leer. Principalmente porque no hay muchos idiomas que compartan dichos constructos. Así que, como regla general personal, lo evito a menos que agregue código a una expresión preexistente y no quiera cambiar completamente su formato.

Ejemplo: tengo una macro (no estoy discutiendo si deberías usar macros o no, a veces ni siquiera tú la escribiste)

FIND_SOMETHING (X) (x> 2)? find_fruits (x): find_houses (x)

Y generalmente lo uso en asignaciones como my_possession = FIND_SOMETHING (34);

Ahora quiero agregar log a él para fines de depuración, pero no puedo cambiar las funciones de búsqueda. Yo podría hacer :

FIND_SOMETHING (X) (x> 2)? (LOG ("buscando frutas"), find_fruits (x)) :( LOG ("buscando casas"), find_houses (x))


Lo siguiente fue escrito asumiendo que es código C, ya sea en un archivo C o dentro de un bloque C de un archivo C ++:

No tiene sentido si . Llamará blah (), sin embargo, el resultado de blah () no se considera en absoluto. Lo único que se considera es 5, por lo tanto, el if siempre se evaluará como verdadero. IOW podrías escribir este código como

blah(); // do something

sin ningún, si, en absoluto.


Sé una cosa que este tipo de código debería hacer: debería disparar el codificador. Tendría mucho miedo de trabajar al lado de alguien que escribe así.


Si el operador de coma no está sobrecargado, el código es similar a esto:

blah(); if (5) { // do something }

Si el operador de coma está sobrecargado, el resultado se basará en esa función.

#include <iostream> #include <string> using namespace std; string blah() { return "blah"; } bool operator,(const string& key, const int& val) { return false; } int main (int argc, char * const argv[]) { if (blah(), 5) { cout << "if block"; } else { cout << "else block"; } return 0; }

(editado para mostrar el escenario de sobrecarga del operador de coma. Gracias a David Pierre por comentar sobre esto)


Yo diría que eso depende de blah ().


Yo uso a veces construcciones como esta para la depuración. Cuando fuerzo el if close para ser cierto independientemente del valor de retorno de bla. Es obvio que nunca debería aparecer en el código de producción.