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


195
#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위 프로그램에서 어떻게 평가되고 있습니까?


42
나는 그것을 믿는가 i && (&i)? SO에 대한 중복 게시물을 찾을 수 없다는 것이 흥미 롭습니다.
irrelephant

42
while (i &&& i <-- j) {}.
kennytm


8
중복은 아니지만 비슷한 질문이며 좋은 연결입니다.
Nathan Cooper

답변:


272

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

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

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

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


1
왜 안되죠 : c = i & (&&i);; i라벨은 어디에 있습니까 ?
anishsane

4
@anishsane은로 i정의되어 int있으며 질문에 레이블이 없습니다. 또한, 최대 뭉크 ...
Luchian Grigore

5
@ anishsane : 그리고 &&라벨의 주소를 취하는 운영자는 표준이 아닌 gcc 확장입니다. 그러나 표준이더라도 최대 뭉크 규칙은 공백을 삽입하지 않는 한 그 방식으로 구문 분석되는 것을 방지합니다.
Keith Thompson

실제로로 &i평가할 수 false있습니다. 때로는 기본값으로 사용됩니다. 예 : 매개 변수없이 호출 된 경우 in void fn(type& x = *reinterpret_cast<type*>(NULL)); 의 값은 얼마입니까? 0 일명 거짓입니다. 그러나 설명 된 방식으로 사용하면, 그렇지 않으면 항상 사실 이며, 내가 설명한대로 사용했다면 . &xfnfni == 0c = &i && i
Adrian

@LuchianGrigore : 어떻게 요?
Adrian

118

&&&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++
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.