with significa relacionales que prioridad operadores operador condicional compiling asignacion c++ c operators compiler-optimization gcc-warning

significa - operadores relacionales en c++



¿Qué es &&& operación en C? (2)

Es c = i && (&i); , con la segunda parte siendo redundante, ya que nunca evaluaré como false .

Para un tipo definido por el usuario, donde realmente puede sobrecargar un operator & único, puede ser diferente, pero aún así es una muy mala idea .

Si activa las advertencias , obtendrá algo como:

advertencia: la dirección de ''i'' siempre se evaluará como ''true''

#include <stdio.h> volatile int i; int main() { int c; for (i = 0; i < 3; i++) { c = i &&& i; printf("%d/n", c); } return 0; }

La salida del programa anterior compilado usando gcc es

0 1 1

Con la opción -Wall o -Waddress , gcc emite una advertencia:

warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]

¿Cómo se evalúa c en el programa anterior?


No hay un &&& operador o token en C. Pero los && (lógico "y") y & (dirección única o bitwise "y") existen operadores.

Por la regla máxima de munch , esto:

c = i &&& i;

es equivalente a esto:

c = i && & i;

Establece c en 1 si tanto i como &i son verdaderos, y en 0 si alguno de ellos es falso.

Para un int, cualquier valor distinto de cero es verdadero. Para un puntero, cualquier valor que no sea nulo es verdadero (y la dirección de un objeto siempre es no nula). Asi que:

Establece c en 1 si i es distinto de cero, o en 0 si i es igual a cero.

Lo que implica que el &&& se está utilizando aquí solo para ofuscación deliberada. La tarea podría ser cualquiera de los siguientes:

c = i && 1; c = !!i; c = (bool)i; // C++ or C with <stdbool.h> c = i ? 1 : 0; /* C */ c = i ? true : false; // C++