"!!"는 C로 뭐죠?
다음과 같은 스니펫이 있습니다.
pt->aa[!!(ts->flags & MASK)] = -val;
- 무엇인가.
!!(이중 느낌표/ 느낌표/두 개의 NOT 연산자)는 c를 의미합니까? - Doesn't.
(!!NULL) == NULL?
!부정입니다.그렇게!!부정의 부정입니다.중요한 것은 그 결과가 우리 모두에게 영향을 미칠 것이라는 사실이다.int.
!!x한다면x == 0이!!0,그것은!1,그것은0.!!x한다면x != 0이!!(!0),그것은!!1,그것은!0,그것은1.
!!0이 0인 채로 0이 아닌 값을 1로 변환하는 경우 일반적으로 사용됩니다.
그리고 사실,!!NULL == NULL,부터!!NULL == !!0그리고.!!0 == !1그리고 마지막으로!1 == 0.
그 결과, 당신이 인용한 짧은 코드 조각에서 어레이의 서브스크립트는 다음 중 하나가 됩니다.0괄호 안의 식 값이NULL,그리고.1그렇지않으면.
이것은 일반적으로 임의의 값을 I/O로 변환하기 위해 사용됩니다.ints 0 또는 1은 부울 not 연산자의 반복 적용에 의한 것이다.!.
예:!5656은 부울로 볼 때 "true"이기 때문에 0입니다.즉,!!561 이니까!0는 1 입니다.
!E와 같다E == 0그렇게!!E와 같다(E == 0) == 0.!!부울 값을 정규화하는 데 사용됩니다.
C99 에서는, 다음과 같이 치환할 수 있습니다.
#include <stdbool.h>
pt->aa[(bool)(ts->flags & MASK)] = -val;
물론 코드를 C89로 이식하려면 !! 트릭을 하는 것이 좋습니다.
pt->aa[(ts->flags & MASK)!=0] = -val;
또는
pt->aa[(ts->flags & MASK)?1:0] = -val;
생성된 코드는 확실히 동일합니다.
숫자를 표준 부울로 변환합니다.
이 경우 결과를 사용하여 어레이를 인덱싱하기 때문에 이 작업을 수행하는 것이 중요합니다.
!!x그냥...!(!x).- 한다면
NULL그럼 0으로 정의됩니다.!!NULL == !!0 == !(!0) == !(1) == 0.
!! 는, 복수의 식에 의한 조건부 할당 등, 특정의 상황에서 컴파일러를 소거하는 적절한 방법입니다.예를 들어 다음과 같습니다.
int _blah = 100;
int *blah;
if ( _blah > 100 && !!(blah = &_blah) ) {
// do stuff
}
이것은 권장하지 않습니다.경고는 보통 좋은 코딩 관행을 강제하기 위해 존재합니다.
언급URL : https://stackoverflow.com/questions/14751973/what-is-in-c
'programing' 카테고리의 다른 글
| 구성 요소가 여러 번 로드되면 eventBus가 중복 이벤트를 수신합니다. (0) | 2022.07.23 |
|---|---|
| 캐스팅 없이 더블을 롱으로 변환하려면 어떻게 해야 하나요? (0) | 2022.07.23 |
| 파라미터로서의 Java Pass 메서드 (0) | 2022.07.23 |
| Vue js;Vue 라우터가 단순 경로에서 생성자 오류가 아닙니다. (0) | 2022.07.23 |
| Vuejs-nuxt(SSR 모드)가 getter 내부 플러그인을 통해 UserUID를 가져올 수 없습니다.GetUserUUID에 대해 정의되지 않은 것으로 표시됨 (0) | 2022.07.23 |