significa relacionales que operadores operador jerarquia estructuras condicional aritmeticos c++ c operators

relacionales - operadores en c++



¿Qué es esto=! ¿operador? (13)

Esta pregunta ya tiene una respuesta aquí:

Me sorprendió este código:

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

Pero a nunca se le asigna un valor. ¿De qué se trata este operador?


¡Son dos operadores, = y ! , ni uno. Puede ser una manera ofuscada de escribir

a = !b; if (a) { // whatever }

estableciendo a a la inversa lógica de b , y probando si el resultado es verdadero (o, de manera equivalente, si b era falso).

O podría ser una escritura errónea de a != b


C ++ no tiene an =! operador, lo que significa inmediatamente que este es un operador = seguido de a ! operador. Entonces, simplemente tiene a = !b en la condición if .


Creo que este es uno de los errores de escritura o impresión. Porque si no podemos compilar este código ya que contiene un error de compilación. Y aquí está dentro de la cláusula if , el tipo de retorno debe ser booleano. Entonces, ¿cómo puede ser posible? La respuesta es simplemente un error o como dijo Mike ofuscado forma de escribir .

Y solo es posible si ambas variables a y b son booleanas y se compilarán como a es igual a (no) b ie (a =! B).


Eso no es un solo operador, sin embargo, es una gran manera de ofuscar el código.

Si se escribiera a=!b lugar, el espacio en blanco podría no llevarlo a creer que era un solo operador.

Los compiladores tienen advertencias para la asignación en una expresión condicional a menos que ajuste la declaración completa en un conjunto de paréntesis, y este es un ejemplo perfecto de cuándo esta advertencia sería útil.

Ambas declaraciones son funcionalmente idénticas, pero una genera una advertencia y la otra no:

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

-parentheses

Advierta si los paréntesis se omiten en ciertos contextos, como cuando hay una asignación en un contexto donde se espera un valor de verdad, o cuando los operadores están anidados, cuya prioridad a menudo las personas se confunden.

Esto, por supuesto, asume que usted es un programador responsable y realmente lee las advertencias que su compilador escupe.

Usando el espacio en blanco de una manera más razonable, la declaración es en realidad:

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

¡La advertencia del compilador mencionada anteriormente es realmente útil en el caso en que la persona que escribió este código accidentalmente transpuso ! y = Sin embargo, a partir de los crípticos comentarios en línea en su pregunta original, a = !b es probablemente la intención del autor.


Esto es todo acerca de la claridad del código:

Debe escribirse como: if (a = !b)

if (a = !b) es lo mismo que decir si a está asignado a !b . Entonces, técnicamente hay 2 operadores separados que se utilizan, = que es una operación de asignación, y ! que es una expresión lógica

¡Solo ponga un espacio entre = y ! resuelve esta confusión


Esto se puede tomar cuando se asigna a !b


Estoy tratando de responder su pregunta y, de acuerdo con la answer de Mike, solo estoy sumando.

También puedes entenderlo por a=!!b .
El código a=!b devuelve 0 a a y a=!!b devuelve 1 a a .

The =! no es un solo operador sino la combinación de estos dos. Se les pide a estos tipos de preguntas que desvíen a los alumnos para verificar sus habilidades de codificación .


Hace mucho tiempo, cuando los dinosaurios vagaban por la tierra y C corría en la quinta edición de UNIX en PDP-11s, =! era el operador ''no igual''. Este uso fue desaprobado por la creación del estándar C , por lo que ahora significa ''asignar el inverso lógico'', como en a = !b Este es un buen argumento para siempre rodear a los operadores binarios con espacios, solo para dejar en claro a los humanos que leen el código lo que el compilador está pensando.

Estoy un poco sorprendido de que nadie más haya mencionado esto, pero de nuevo puedo ser el único usuario de SO que alguna vez tocó un compilador de C tan antiguo.


Son dos operadores diferentes: el operador = (asignación) junto con el ! operador. Básicamente se puede traducir a una asignación de a al valor negado de b .

if (a = !b)

Pero, lo que probablemente el usuario quería escribir era el operador !=

if (a != b)


a se le asigna la negación booleana de b en esa línea. Es solo un formato incorrecto

if( a = !b ) {

... y una mala asignación oculta dentro de una condición.


Operadores en C ++

De acuerdo con la lista de operadores C / C ++ no hay operador como =! . Sin embargo, hay un operador != ( No es igual a , operadores de comparación / operador relacional )

Hay dos posibilidades

  1. ¡ Podría ser un error de tipeo ya que me he dado cuenta de que =! operadores está en la declaración if y alguien está tratando de escribir != lugar de =! porque != es el operador de comparación que devuelve verdadero o falso .
  2. Posiblemente, el desarrollador estaba tratando de asignar la negación booleana de b a a y él / ella ha cometido un error tipográfico y se olvidó de poner un espacio después del signo igual. Así es como el compilador lo interpreta, de todos modos. De acuerdo con la precedencia del operador en c ++ :
    • La precedencia Lógica NO ( ! ) Del operador es 3 y la Asociatividad es de derecha a izquierda
    • La asignación directa del operador (=) es 16 y la asociatividad es de derecha a izquierda

Puede haber tres razones para esto:

  1. Podría ser una escritura errónea del operador != , Lo que significa que no es igual a. Ejemplo:

    if (a != b) { // a is not equal to b }

  2. Podría ser una mistyping a == !b , lo que significa que a es igual a not b , que comúnmente se usaría con booleanos. Ejemplo:

    if (a == !b) { // The boolean a is equal to not b (a is not equal to b) }

  3. Podría estar intentando asignar a a la inversa de b . Ejemplo:

    bool a = !b; // Sets a to the opposite of b


a =! b

es solo una forma divertida de poner

a = !b

es decir, la asignación de not b a a .

El valor de la expresión es a después de la asignación.

Con el siguiente código, puede ver que el valor de la expresión a = !b es !false (es decir, true ), y luego puede ver que la asignación se ha realizado al verificar el valor de a , que también es 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!