Quais são as vantagens e desvantagens do operador?: Em oposição à instrução if-else padrão. Os mais óbvios são:
Condicional?: Operador
- Mais curto e mais conciso ao lidar com comparações e atribuições de valor direto
- Não parece ser tão flexível quanto a construção if / else
If / Else padrão
- Pode ser aplicado a mais situações (como chamadas de função)
- Muitas vezes são desnecessariamente longos
A legibilidade parece variar para cada um, dependendo da declaração. Um pouco depois de ser exposto ao operador? :, demorei algum tempo para digerir exatamente como funcionava. Você recomendaria usá-lo sempre que possível, ou se limitar a if / else, visto que trabalho com muitos não programadores?
c#
conditional-operator
KChaloux
fonte
fonte
SomeCheck() ? DoFirstThing() : DoSecondThing();
- você tem que usar a expressão para retornar um valor.Respostas:
Eu basicamente recomendaria usá-lo apenas quando a instrução resultante for extremamente curta e representar um aumento significativo na concisão sobre o equivalente if / else sem sacrificar a legibilidade.
Bom exemplo:
Mau exemplo:
fonte
return
participação no resultado da operação ternária. Por exemplo:check() ? return 1 : return 0;
não vai funcionar, masreturn check() ? 1 : 0;
vai. É sempre divertido encontrar essas pequenas peculiaridades na programação.Isso é praticamente coberto pelas outras respostas, mas "é uma expressão" não explica realmente por que isso é tão útil ...
Em linguagens como C ++ e C #, você pode definir campos somente leitura locais (dentro de um corpo de método) usando-os. Isso não é possível com uma instrução if / then convencional porque o valor de um campo somente leitura deve ser atribuído dentro dessa instrução única:
não é o mesmo que:
De maneira semelhante, você pode incorporar uma expressão terciária em outro código. Além de tornar o código-fonte mais compacto (e em alguns casos mais legível como resultado), ele também pode tornar o código de máquina gerado mais compacto e eficiente:
... pode gerar menos código do que ter que chamar o mesmo método duas vezes:
Claro, também é uma forma mais conveniente e concisa (menos digitação, menos repetição e pode reduzir a chance de erros se você tiver que duplicar pedaços de código em um if / else). Em casos de "padrão comum" limpo como este:
... é simplesmente mais rápido de ler / analisar / compreender (uma vez que você esteja acostumado) do que o prolixo if / else equivalente, então pode ajudá-lo a 'grocar' código mais rápido.
Claro, só porque é útil não significa que seja a melhor coisa para usar em todos os casos. Aconselho usá-lo apenas para pequenos trechos de código onde o significado é claro (ou mais claro) usando
?:
- se você usá-lo em um código mais complexo ou aninhar operadores ternários entre si, pode tornar o código terrivelmente difícil de ler .fonte
const
é constante, ou seja, não pode ser alterado após a execução da instrução em que foi declarado.readonly
assim? Sempre pensei queconst
significava " resolvido em tempo de compilação e alinhado sempre que usado ".Eu geralmente escolho um operador ternário quando, de outra forma, teria muito código duplicado.
Com um operador ternário, isso pode ser realizado da seguinte maneira.
fonte
aVal = a > 0 ? a : -a; answer = compute(aVal,b,c,d,e);
Especialmente seb
,c
,d
ee
necessitou de tratamento também.compute(...)
éa > 0 ? a : -1
, que é avaliado separadamente dos outros argumentos separados por vírgula. De qualquer forma, infelizmente C ++ não tem a notação que sua pergunta apresenta para lidar com "tuplas" de valores separados por vírgula, então evena > 0 ? (a, b, c, d, e) : (-a, b, c, d, e)
é ilegal e não há nada muito semelhante que funcione sem mudanças emcompute
si mesmo.Acho que é particularmente útil ao fazer desenvolvimento web se eu quiser definir uma variável para um valor enviado na solicitação, se estiver definido, ou para algum valor padrão, se não estiver.
fonte
Um uso muito legal é:
fonte
foo
for falso, então a coisa toda será avaliada como 4 sem fazer os outros testes.O operador condicional é ótimo para condições curtas, como esta:
Eu uso ocasionalmente porque leva menos tempo para escrever algo dessa forma ... infelizmente, essa ramificação pode às vezes ser perdida por outro desenvolvedor navegando em seu código. Além disso, o código geralmente não é tão curto, então geralmente ajudo a legibilidade colocando o caractere? e: em linhas separadas, como esta:
No entanto, a grande vantagem de usar blocos if / else (e por que eu os prefiro) é que é mais fácil entrar mais tarde e adicionar alguma lógica adicional ao branch,
ou adicione outra condição:
Portanto, no final das contas, trata-se de conveniência para você agora (mais curto de usar:?) Vs. conveniência para você (e outros) mais tarde. É um julgamento ... mas como todos os outros problemas de formatação de código, a única regra real é ser consistente e ser visualmente cortês com aqueles que precisam manter (ou avaliar!) Seu código.
(todo o código compilado)
fonte
Uma coisa a reconhecer ao usar o operador ternário é que ele é uma expressão, não uma declaração.
Em linguagens funcionais como o esquema, a distinção não existe:
(if (> ab) ab)
Condicional?: Operador "Não parece ser tão flexível quanto a construção if / else"
Em linguagens funcionais, sim.
Ao programar em linguagens imperativas, aplico o operador ternário em situações em que normalmente usaria expressões (atribuição, declarações condicionais, etc.).
fonte
Embora as respostas acima sejam válidas e eu concorde com a importância da legibilidade, há mais 2 pontos a serem considerados:
Isso torna particularmente conciso usar o ternário:
Se você tiver tipos
T1
eT2
ambos puderem ser convertidos implicitamenteT
, o seguinte não funcionará:(porque o compilador tenta determinar o tipo da expressão ternária e não há conversão entre
T1
eT2
.)Por outro lado, a
if/else
versão abaixo funciona:porque
T1
é convertido emT
e então éT2
fonte
Às vezes, pode tornar a atribuição de um valor bool mais fácil de ler à primeira vista:
fonte
Se estou definindo um valor e sei que sempre haverá uma linha de código para fazer isso, normalmente uso o operador ternário (condicional). Se houver uma chance de meu código e lógica mudarem no futuro, eu uso um if / else, pois é mais claro para outros programadores.
De mais interesse para você pode ser o ?? operador .
fonte
A vantagem do operador condicional é que ele é um operador. Em outras palavras, ele retorna um valor. Como
if
é uma declaração, não pode retornar um valor.fonte
Eu recomendaria limitar o uso do operador ternário (? :) à atribuição simples de uma única linha lógica if / else. Algo semelhante a este padrão:
Pode ser facilmente convertido para:
Eu evitaria usar o operador ternário em situações que exigem if / else if / else, if / else aninhado ou lógica de ramificação if / else que resulta na avaliação de várias linhas. Aplicar o operador ternário nessas situações provavelmente resultaria em código ilegível, confuso e não gerenciável. Espero que isto ajude.
fonte
Há algum benefício de desempenho em usar o? operador, por exemplo. MS Visual C ++, mas isso é realmente uma coisa específica do compilador. O compilador pode realmente otimizar o desvio condicional em alguns casos.
fonte
O cenário que mais me encontro usando é para valores padrão e especialmente em retornos
Esses são realmente os únicos lugares que acho legais, mas para eles eu acho.
Porém, se você está procurando um booleano, isso às vezes pode parecer uma coisa apropriada a se fazer:
Porque é tão fácil de ler e entender, mas essa ideia deve sempre ser jogada para o mais óbvio:
fonte
Se você precisar de vários branches na mesma condição, use um if:
Se você precisar de vários branches com condições diferentes, se a contagem de instruções for como uma bola de neve, você desejará usar o ternário:
Além disso, você pode usar o operador ternário na inicialização.
Fazer isso com if é muito confuso:
Você não pode colocar a inicialização dentro de if / else, porque isso muda o escopo. Mas referências e variáveis const só podem ser vinculadas na inicialização.
fonte
O operador ternário pode ser incluído em um rvalue, enquanto um if-then-else não pode; por outro lado, um if-then-else pode executar loops e outras instruções, enquanto o operador ternário só pode executar (possivelmente nulo) rvalues.
Em uma nota relacionada, o && e || operadores permitem alguns padrões de execução que são mais difíceis de implementar com if-then-else. Por exemplo, se alguém tem várias funções para chamar e deseja executar um trecho de código se alguma delas falhar, isso pode ser feito muito bem usando o operador &&. Fazer isso sem esse operador exigirá um código redundante, um goto ou uma variável de sinalização extra.
fonte
Com o C # 7 , você pode usar o novo recurso ref locais para simplificar a atribuição condicional de variáveis compatíveis com ref. Então agora, você não só pode fazer:
... mas também o extremamente maravilhoso:
Essa linha de código atribui o valor de
a
ab
ouc
, dependendo do valor dei
.Notas
1. O valor r é o lado direito de uma atribuição, o valor que é atribuído.
2. O valor-l é o lado esquerdo de uma atribuição, a variável que recebe o valor atribuído.
fonte