O que o operador vírgula fazer?
-
02-07-2019 - |
Pergunta
O que faz o seguinte código de fazer em C / C ++?
if (blah(), 5) {
//do something
}
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.