#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;
}
El resultado 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 c
evalúa en el programa anterior?
c++
c
operators
compiler-optimization
gcc-warning
manav mn
fuente
fuente
i && (&i)
? Es interesante que no pueda encontrar una publicación duplicada en SO.while (i &&& i <-- j) {}
.Respuestas:
Es
c = i && (&i);
, con la segunda parte siendo redundante, ya&i
que nunca se evaluaráfalse
.Para un tipo definido por el usuario, donde realmente puede sobrecargar unario
operator &
, puede ser diferente, pero sigue siendo una muy mala idea .Si activa las advertencias , obtendrá algo como:
fuente
c = i & (&&i);
; ¿Dóndei
está alguna etiqueta?i
se define comoint
y no hay etiquetas en la pregunta. Además, munch máximo ...&&
operador que toma la dirección de una etiqueta es una extensión gcc no estándar de todos modos. Pero incluso si fuera estándar, la regla de munch máxima evitaría que se analizara de esa manera (a menos que inserte un espacio).&i
puede evaluar afalse
. A veces se usa para valores predeterminados. Ejemplo:void fn(type& x = *reinterpret_cast<type*>(NULL));
¿Cuál es el valor de&x
infn
sifn
se llama sin parámetros? Es 0 aka falso. Sin embargo, usándolo de la manera descrita, siempre será cierto a menos quei == 0
, y si uno lo estuviera utilizando como lo describí, lo seríac = &i && i
.No hay
&&&
operador o token en C. Pero el&&
(lógico "y") y&
(dirección unaria de o bit a bit "y") existen.Por la regla de munch máxima , esto:
es equivalente a esto:
Se establece
c
en 1 si ambosi
y&i
son verdaderas, y 0 si alguno de ellos es falso.Para un int, cualquier valor distinto de cero es verdadero. Para un puntero, cualquier valor no nulo es verdadero (y la dirección de un objeto siempre es no nulo). Entonces:
Se establece
c
en 1 sii
no es cero, o0
sii
es igual a cero.Lo que implica que
&&&
se está utilizando aquí solo para ofuscación deliberada. La asignación podría ser cualquiera de los siguientes:fuente