왜 (조건)을 사용하지 않고 !(조건)을 사용합니까?
나는 사람들이 조건부 절을 두 개의 '!'로 사용하는 코드를 본 적이 있습니다.
#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)입니다._Bool
int
이 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
'source' 카테고리의 다른 글
curl cmd를 jQuery $.ajax()로 변환하는 중 (0) | 2023.09.24 |
---|---|
Google ReCAPTCHA v3 - fonts.gstatic.com 에서 Roboto를 로드하는 블록 (0) | 2023.09.24 |
"!!"가 포함된 문자열을 전달할 때 argv의 이상한 동작!" (0) | 2023.09.24 |
asp.net vnext에서 wwwroot란 무엇입니까? (0) | 2023.09.24 |
각도-소재 날짜/시간 선택기 구성요소? (0) | 2023.09.24 |