#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 gcces
0
1
1Con la opción -Wallo -Waddress, gccemite una advertencia:
warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]¿Cómo se cevalú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&ique 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óndeiestá alguna etiqueta?ise define comointy 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).&ipuede evaluar afalse. A veces se usa para valores predeterminados. Ejemplo:void fn(type& x = *reinterpret_cast<type*>(NULL));¿Cuál es el valor de&xinfnsifnse 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
cen 1 si ambosiy&ison 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
cen 1 siino es cero, o0siies 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