programing

"!!"는 C로 뭐죠?

prostudy 2022. 7. 23. 09:18
반응형

"!!"는 C로 뭐죠?

다음과 같은 스니펫이 있습니다.

pt->aa[!!(ts->flags & MASK)] = -val;
  1. 무엇인가.!!(이중 느낌표/ 느낌표/두 개의 NOT 연산자)는 c를 의미합니까?
  2. 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;

생성된 코드는 확실히 동일합니다.

숫자를 표준 부울로 변환합니다.

이 경우 결과를 사용하여 어레이를 인덱싱하기 때문에 이 작업을 수행하는 것이 중요합니다.

  1. !!x그냥...!(!x).
  2. 한다면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

반응형