Pregunta

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

if (blah(), 5) {
    //do something
}
¿Fue útil?

Solución

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 utilizará el operador de coma y 5 será lo único que se utilizará para determinar el valor verdadero / falso de la expresión.


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

Otros consejos

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

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)

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

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.";
}

Diría que eso depende de blah ().

En una respuesta más amplia. El operador de coma (no sobrecargado) 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 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 muchos idiomas comparten tales construcciones. Entonces, como regla general, lo evito a menos que agregue código a una expresión preexistente y no quiera cambiar completamente su formato.

Ejemplo: Tengo una macro (sin discutir si debería usar macros o no, a veces ni siquiera es usted quien la escribió)

ENCONTRAR ALGO (X) (x > 2)? find_fruits (x): find_houses (x)

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

Ahora quiero agregarle un registro para propósitos de depuración pero no puedo cambiar las funciones de búsqueda. Podría hacer:

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

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

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

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

blah();
// do something

sin ningún si en absoluto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top