Pergunta

O que faz o seguinte código de fazer em C / C ++?

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

Solução

operador vírgula é aplicada e o valor 5 é usado para determinar o condicional verdadeiro / falso.

Ele irá executar blah () e receber algo de volta (presumivelmente), então o operador vírgula é empregada e 5 será a única coisa que é usado para determinar o valor true / false para a expressão.


Note-se que a, operador poderia ser sobrecarregado para o tipo de retorno da função de bla () (que não foi especificada), fazendo com que o resultado não-óbvia.

Outras dicas

Se o operador vírgula não está sobrecarregado, o código é semelhante a este:

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

Se o operador vírgula está sobrecarregado, o resultado será baseada nessa função.

#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 vírgula cenário sobrecarga de operadores. Graças a David Pierre para comentar sobre isso)

Uma coisa eu sei que esse tipo de código deve fazer: deve obter o codificador demitido. Eu seria um pouco com medo de trabalho ao lado de alguém que escreve assim.

No caso patológico, isso depende do que o operador vírgula faz ...

class PlaceHolder
{
};

PlaceHolder Blah() { return PlaceHolder(); }

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

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

Eu diria que depende blah ().

Em uma resposta mais ampla. O operador vírgula (não sobrecarregado) resolve como em, executar a primeira parte e voltar a segunda parte.

Então, se você tem (foo (), bar ()) Ambas as funções serão executadas, mas o valor dos avalia expressão para barrar () (e o tipo da expressão também).

Enquanto eu não vou dizer que há usos justos para isso, é geralmente considerado um pouco difícil de ler o código. Principalmente porque não muitas línguas ações tais construções. Então, como uma regra prática pessoal eu evitá-lo a menos que eu estou adicionando código para uma expressão preexistente e não querem mudar completamente seu formato.

Exemplo: Eu tenho uma Macro (não discutir se você deve usar macros ou não, às vezes, não é mesmo você que escreveu)

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

E eu costumo usá-lo em tarefas como my_possession = FIND_SOMETHING (34);

Agora eu quero adicionar log-lo para fins debuggin mas não posso alterar as funções achado ,. Eu poderia fazer:

FIND_SOMETHING (X) (x> 2)? (LOG ( "à procura de frutos"), find_fruits (x)) :( LOG ( "à procura de casas"), find_houses (x))

Eu uso às vezes constrói como esta para fins de depuração. Quando eu forçar a se perto de ser verdade, independentemente do valor de retorno de blah. É óbvio que ele nunca deve aparecer no código de produção.

O seguinte foi escrito supondo que ele é o código de C, em um arquivo de C ou dentro de um bloco C de um ficheiro C ++:

É um inútil se . Ele vai chamar blah (), no entanto o resultado de blah () não é considerado pela se em tudo. A única coisa a ser considerada é 5, assim, a se sempre avaliar a verdade. IOW você poderia escrever esse código como

blah();
// do something

sem qualquer se em tudo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top