source

왜 (조건)을 사용하지 않고 !(조건)을 사용합니까?

ittop 2023. 9. 24. 13:07
반응형

왜 (조건)을 사용하지 않고 !(조건)을 사용합니까?

나는 사람들이 조건부 절을 두 개의 '!'로 사용하는 코드를 본 적이 있습니다.

#define check_bit(var, pos)       (!!((var) & (1 << (pos))))
#define likely(x)       __builtin_expect(!!(x),1)
#define unlikely(x)     __builtin_expect(!!(x),0)

제가 찾을 수 있는 예시들입니다.

사용하는 데 이점이 있습니까?!!(condition)위에(condition)?

만약 당신이 적용하고 있는 변수가!!이미 가 아닙니다.bool(0 또는 1 하나) 그러면 값이 다음 중 하나로 정규화됩니다.0아니면1.

에 관하여__builtin_expect커널 뉴비 스레드는 표기법에 대해 논의하며, 응답 중 하나는 다음을 설명합니다(emphasis mine).

__builtin_expect의 서명

http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html)다음과 같습니다.

long __builtin_expect (long exp, long c)

exp 매개 변수는 적분식이어야 하므로 포인터나 부동 소수점 유형이 없습니다.이중 부정은 이러한 유형에서 적분식으로의 변환을 자동으로 처리합니다.이렇게 하면 가능성(ptr!= NULL) 대신 가능성(ptr)이라고 간단히 쓸 수 있습니다.

C99에 참고용 bool매크로가 다음으로 확장됩니다._Bool,true까지 확장.1그리고.false까지 확장.0. 자세한 내용은 표준 초안 섹션에 나와 있습니다.7.16 부울 유형 값.

논리적 부정은 에 포함됩니다.6.5.3.3 제5항단항 연산자:

논리적 부정 연산자!의 결과는 피연산자의 값이 0과 같지 않으면 0이 되고 피연산자의 값이 0과 같으면 1이 됩니다.결과에 형식 int가 있습니다.!E 식은 (0==E)와 같습니다.

유니언!임의의 스칼라에 적용되는 논리적 부정 연산자는 다음을 산출합니다.int가치0피연산자가 0이 아니면,1피연산자가 0인 경우.표준 인용:

표정이!E와 동치입니다.(0==E).

적용중!값이 거짓이면 거짓, 참이면 참, 결과는 다음과 같이 정규화됩니다.0아니면1,각각 다음과 같다.

대부분의 경우 스칼라 값을 조건으로 직접 사용할 수 있으므로 이는 필요하지 않습니다.하지만 어떤 경우에는 당신이 실제로 필요한 것은0아니면1가치.

C99 또는 그 이후에 식을 다음에 캐스팅하는 것._Bool(또는 에)bool이 가지고 있다면#include <stdbool.h>유사한 행동을 하며 더 명확하다고 여겨질 수 있습니다.a나 (a)입니다._Boolint이 C99 이전 컴파일러를한다면, (b) C99 를을 를합니다._Bool그리고 당신은 당신 자신의 것을 정의했습니다.bool인 C99다와 _Bool.

가 볼 수 큰 것은 이 가치를 시킬(입니다) 로 (또는 것이라는 것입니다.1아니면0 입니다)의에 관계없이.x아니면var:다예:char아니면double아니면int또는 기타).

때때로 유용할 수 있는 부울에 캐스트됩니다.

언급URL : https://stackoverflow.com/questions/20916472/why-use-condition-instead-of-condition

반응형