C에서 &&& 란 무엇입니까

#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;
}

를 사용하여 컴파일 된 위 프로그램의 출력 gcc

0
1
1

으로 -Wall또는 -Waddress옵션, gcc경고를 :

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

c위 프로그램에서 어떻게 평가되고 있습니까?



답변

그건 c = i && (&i);이후, 두 번째 부분의 존재의 중복으로 &i로 평가하지 않습니다 false.

실제로 unary를 오버로드 할 수있는 사용자 정의 유형의 operator &경우 다를 수 있지만 여전히 나쁜 생각 입니다.

warnings켜면 다음과 같은 결과가 나타납니다.

경고 : ‘i’의 주소는 항상 ‘true’로 평가됩니다


답변

&&&C 에는 연산자 나 토큰 이 없지만 &&(논리적 “and”) 및 &(단일 주소 또는 비트 단위 “and”) 연산자는 존재합니다.

에 의해 최대의 뭉크의 규칙이 :

c = i &&& i;

이것과 같습니다 :

c = i && & i;

그것은 설정 c한 두 경우에 i&i해당하고, 0으로 둘 중 하나는 거짓 인 경우.

int의 경우 0이 아닌 값은 true입니다. 포인터의 경우 null이 아닌 값은 true이며 개체의 주소는 항상 null이 아닙니다. 그래서:

0이 아닌 경우 또는 0과 같은 경우 c1로 설정 됩니다.i0i

이것은 &&&의도적으로 난독 화를 위해 여기에서 사용되고 있음을 의미합니다 . 과제는 다음 중 하나 일 수도 있습니다.

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


답변