Domanda

Cosa fa il seguente codice in C / C ++?

if (blah(), 5) {
    //do something
}
È stato utile?

Soluzione

L'operatore virgola viene applicato e il valore 5 viene utilizzato per determinare il vero / falso del condizionale.

Eseguirà blah () e recupererà qualcosa (presumibilmente), quindi verrà utilizzato l'operatore virgola e 5 sarà l'unica cosa utilizzata per determinare il valore vero / falso per l'espressione.


Si noti che l'operatore, potrebbe essere sovraccaricato per il tipo di ritorno della funzione blah () (che non è stato specificato), rendendo il risultato non ovvio.

Altri suggerimenti

Se l'operatore virgola non è sovraccarico, il codice è simile al seguente:

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

Se l'operatore virgola è sovraccarico, il risultato sarà basato su quella funzione.

#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;
}

(modificato per mostrare lo scenario di sovraccarico dell'operatore virgola. Grazie a David Pierre per aver commentato questo)

So una cosa che questo tipo di codice dovrebbe fare: dovrebbe far sparare il programmatore. Avrei un po 'paura di lavorare accanto a qualcuno che scrive così.

Nel caso patologico, dipende da cosa fa l'operatore virgola ...

class PlaceHolder
{
};

PlaceHolder Blah() { return PlaceHolder(); }

bool operator,(PlaceHolder, int) { return false; }

if (Blah(), 5)
{
    cout << "This will never run.";
}

Direi che dipende da blah ().

Su una risposta più ampia. L'operatore virgola (non sovraccarico) si risolve come in, esegue la prima parte e restituisce la seconda parte.

Quindi se hai (foo (), bar ()) Entrambe le funzioni verranno eseguite, ma il valore dell'espressione viene valutato in bar () (e anche il tipo dell'espressione).

Anche se non dirò che ci sono usi corretti per questo, di solito è considerato un codice un po 'difficile da leggere. Principalmente perché non molte lingue condividono tali costrutti. Quindi come regola empirica personale lo evito a meno che non aggiunga codice a un'espressione preesistente e non voglio cambiare completamente il suo formato.

Esempio: ho una Macro (non sto discutendo se dovresti usare le macro o meno, a volte non è nemmeno tu che l'hai scritta)

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

E di solito lo uso in incarichi come my_possession = FIND_SOMETHING (34);

Ora voglio aggiungere il registro ad esso per scopi di debuggin ma non posso cambiare le funzioni di ricerca. Potrei fare:

FIND_SOMETHING (X) (x > 2)? (LOG (" in cerca di frutta "), find_fruits (x)) :( LOG (" in cerca di case "), find_houses (x))

A volte uso costrutti come questo per scopi di debug. Quando forzo il se vicino ad essere vero, indipendentemente dal valore di ritorno di blah. È ovvio che non dovrebbe mai apparire nel codice di produzione.

Quanto segue è stato scritto supponendo che sia un codice C, in un file C o all'interno di un blocco C di un file C ++:

È inutile se . Chiamerà blah (), tuttavia il risultato di blah () non viene considerato da if . L'unica cosa presa in considerazione è 5, quindi il se valuterà sempre come vero. IOW puoi scrivere questo codice come

blah();
// do something

senza se affatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top