#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과 같은 경우 c
1로 설정 됩니다.i
0
i
이것은 &&&
의도적으로 난독 화를 위해 여기에서 사용되고 있음을 의미합니다 . 과제는 다음 중 하나 일 수도 있습니다.
c = i && 1;
c = !!i;
c = (bool)i; // C++ or C with <stdbool.h>
c = i ? 1 : 0; /* C */
c = i ? true : false; // C++