c++ - overload - ternary operator c




O que é isso! operador? (9)

Esta questão já tem uma resposta aqui:

Fiquei surpreso com este código:

if (a =! b) { // let it be on false
    ...
}

Mas nunca é atribuído por um valor. O que é esse operador?


C ++ não tem um =! operador, o que significa imediatamente que este é um operador = seguido por um ! operador. Então, você simplesmente tem a = !b na condição if .


Eles são dois operadores diferentes: o operador = (atribuição) juntamente com o ! operador. Pode basicamente ser traduzido para uma atribuição de a ao valor negado de b .

if (a = !b)

Mas, o que o usuário provavelmente quis escrever foi o operador != :

if (a != b)

Eu acho que isso é um dos erros de escrita ou impressão. Porque se não podemos compilar este código, pois contém um erro de compilação. E aqui está dentro da cláusula if , o tipo de retorno deve ser booleano. Então, como isso é possível? A resposta é simplesmente um erro ou, como Mike disse, ofuscou a maneira de escrever .

E somente possível se ambas as variáveis ​​a e b forem booleanas, as quais serão compiladas como a é igual a (não) b ie (a =! B).


Há muito tempo atrás, quando os dinossauros percorriam a Terra e C corria na 5ª edição do UNIX em PDP-11s, =! era o operador "não é igual". Este uso foi preterido pela criação do Padrão C , então agora significa 'atribuir o inverso lógico', como em a = !b Este é um bom argumento para sempre cercar os operadores binários com espaços, apenas para deixar claro para os humanos que estão lendo o código o que o compilador está pensando.

Estou um pouco surpreso que ninguém mais tenha mencionado isso, mas, novamente, eu posso ser o único usuário SO que já tocou em um compilador C tão antigo.


Isso não é um único operador, é, no entanto, uma ótima maneira de ofuscar o código.

Se fosse escrito a=!b , o espaço em branco poderia não levar você a acreditar que era um único operador.

Os compiladores têm avisos de atribuição em uma expressão condicional, a menos que você envolva toda a instrução em um conjunto de parênteses, e esse é um exemplo perfeito de quando esse aviso seria útil.

Ambas as declarações são funcionalmente idênticas, mas uma gera um aviso e a outra não:

if (a =! b)   // Generates a warning with `-Wparentheses` (gcc)

if ((a =! b)) // No such warning

-Parentheses

Avisar se os parênteses são omitidos em determinados contextos, como quando há uma atribuição em um contexto em que um valor de verdade é esperado ou quando os operadores são aninhados cuja precedência as pessoas geralmente se confundem.

Isso, obviamente, pressupõe que você é um programador responsável e realmente lê os avisos que seu compilador cria.

Usando o espaço em branco de uma maneira mais razoável, a declaração é, na verdade:

if (a = !b) // Assign A the value of (logical) NOT B and then test the truth

O aviso do compilador mencionado acima é realmente útil no caso em que a pessoa que escreveu este código foi acidentalmente transposta ! e = . No entanto, a partir dos comentários in-line crípticos em sua pergunta original, a = !b é provavelmente a intenção do autor.


Isso pode ser considerado como a atribuído a !b


a é atribuída a negação booleana de b nessa linha. É apenas um erro de formatação

if( a = !b ) {

... e uma atribuição mal escondida dentro de uma condição.


Operadores em C ++

De acordo com a lista de operadores C / C ++, não há nenhum operador como =! . No entanto, existe um operador != ( Não é igual a , operadores de comparação / operador relacional )

Existem duas possibilidades.

  1. Pode ser erro de digitação como eu notei que =! operadores está em if e alguém está tentando digitar != vez de =! porque != é o operador de comparação que retorna verdadeiro ou falso .
  2. Possivelmente, o desenvolvedor estava tentando atribuir a negação booleana de b a a e ele / ela fez um erro de digitação e esqueceu de colocar um espaço após o sinal de igual. É assim que o compilador interpreta, de qualquer maneira. De acordo com a precedência do operador em c ++ :
    • Operador Lógico NOT ( ! ) Precedência é 3 e Associatividade é da Direita para a esquerda
    • A atribuição direta do operador (=) precedência é 16 e a associatividade é da direita para a esquerda

a =! b 

é apenas uma maneira engraçada de colocar

a = !b

ou seja, a atribuição de not b para a .

O valor da expressão é a após a atribuição.

Com o código abaixo você pode ver que o valor da expressão a = !b é !false (ou seja, true ), e você pode ver a atribuição ocorrendo verificando o valor de a , que também é true .

#include <iostream>

int main() 
{ 
    bool a = false;
    bool b = false;

    if(a)
        printf("a is true!\n");
    else
        printf("a is false!\n");

    if(a = !b)
        printf("expression is true!\n");
    else
        printf("expression is false!\n");

    if(a)
        printf("a is true!\n");
    else
        printf("a is false!\n");

}

Resultado:

a is false!
expression is true!
a is true!






operators