수색…


비고

미리 정의 된 _Bool 및 헤더 <stdbool.h> 사용하려면 C의 C99 / C11 버전을 사용해야합니다.

컴파일러 경고 및 오류가 발생하지 않도록하려면 C89 및 이전 버전의 언어를 사용하는 경우 typedef / define 예제 만 사용해야합니다.

stdbool.h 사용하기

C99

시스템 헤더 파일 stdbool.h 사용하면 bool 을 부울 데이터 유형으로 사용할 수 있습니다. true1 평가되고 false0 평가됩니다.

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    bool x = true;  /* equivalent to bool x = 1; */
    bool y = false; /* equivalent to bool y = 0; */
    if (x)  /* Functionally equivalent to if (x != 0) or if (x != false) */
    {
        puts("This will print!");
    }
    if (!y) /* Functionally equivalent to if (y == 0) or if (y == false) */
    {
        puts("This will also print!");
    }
}

bool 은 데이터 유형 _Bool 철자입니다. 숫자 또는 포인터가 변환 될 때 특별한 규칙이 있습니다.

#define 사용하기

C는 비교 연산자의 경우 0 을 제외한 모든 정수 값을 true 로, 정수 값 0false 로 효과적으로 처리합니다. C99에서 _Bool 또는 bool 을 사용할 수없는 경우 #define 매크로를 사용하여 C에서 부울 데이터 형식을 시뮬레이션 할 수 있으며 레거시 코드에서도 이러한 부울을 찾을 수 있습니다.

#include <stdio.h>

#define bool int
#define true 1
#define false 0

int main(void) {
    bool x = true;  /* Equivalent to int x = 1; */
    bool y = false; /* Equivalent to int y = 0; */
    if (x) /* Functionally equivalent to if (x != 0) or if (x != false) */
    {
        puts("This will print!");
    }
    if (!y) /* Functionally equivalent to if (y == 0) or if (y == false) */
    {
        puts("This will also print!");
    }
}

이 매크로를 정의한 것이 <stdbool.h> 의 현대적인 사용법과 충돌 할 수 있기 때문에 이것을 새로운 코드에 도입하지 마십시오.

내장 (내장) 유형 사용 _Bool

C99

C 표준 버전 C99에 추가 된 _Bool 은 기본 C 데이터 유형이기도합니다. 값 0 ( false의 경우 )과 1 ( true의 경우 )을 보유 할 수 있습니다.

#include <stdio.h>

int main(void) {
    _Bool x = 1; 
    _Bool y = 0;
    if(x) /* Equivalent to if (x == 1) */
    {
        puts("This will print!");
    }
    if (!y) /* Equivalent to if (y == 0) */
    {
        puts("This will also print!");
    }
}

_Bool 은 정수 유형이지만 다른 유형의 변환에 특별한 규칙이 있습니다. 결과는 if 표현식 의 다른 유형을 사용하는 것과 유사합니다. 다음에서

_Bool z = X;
  • X 에 산술 유형 (숫자의 종류)이 있으면 X == 0 이면 z0 됩니다. 그렇지 않으면 z1 됩니다.
  • X 에 포인터 유형이 있으면 X 가 널 포인터이면 z0 이되고 그렇지 않으면 1 됩니다.

더 좋은 철자 bool , falsetrue 를 사용하려면 <stdbool.h> 를 사용해야합니다.

부울 식의 정수 및 포인터

모든 정수 또는 포인터는 "진리 값"으로 해석되는 표현식에서 사용될 수 있습니다.

int main(int argc, char* argv[]) {
  if (argc % 4) {
    puts("arguments number is not divisible by 4");
  } else {
    puts("argument number is divisible by 4");
  }
...

argc % 4 표현식이 평가되고 값 0 , 1 , 2 또는 3 중 하나로 연결됩니다. 첫 번째, 0 은 "거짓"인 유일한 값이며 else 부분에 실행을 가져옵니다. 다른 모든 값은 "true"이고 if 부분으로 이동합니다.

double* A = malloc(n*sizeof *A);
if (!A) {
   perror("allocation problems");
   exit(EXIT_FAILURE);
}

여기서 포인터 A 가 평가되고 포인터가 널 포인터이면 오류가 감지되고 프로그램이 종료됩니다.

많은 사람들이 무언가를 A == NULL 로 작성하는 대신 다른 복잡한 표현식의 일부로 이러한 포인터 비교를 사용하면 항목을 빨리 읽지 못하게됩니다.

char const* s = ....;   /* some pointer that we receive */
if (s != NULL && s[0] != '\0' && isalpha(s[0])) {
   printf("this starts well, %c is alphabetic\n", s[0]);
}

이를 확인하려면 표현식에서 복잡한 코드를 스캔하고 운영자 기본 설정을 확인해야합니다.

char const* s = ....;   /* some pointer that we receive */
if (s && s[0] && isalpha(s[0])) {
   printf("this starts well, %c is alphabetic\n", s[0]);
}

캡처하기가 상대적으로 쉽습니다. 포인터가 유효하면 첫 번째 문자가 0이 아닌지 확인한 다음 문자인지 확인합니다.

typedef를 사용하여 bool 유형 정의하기

대부분의 디버거가 #define 매크로를 인식하지 못하지만 enum 상수를 검사 할 수 있다는 점을 고려하면 다음과 같이하는 것이 바람직합니다.

#if __STDC_VERSION__ < 199900L
typedef enum { false, true } bool;
/* Modern C code might expect these to be macros. */
# ifndef bool
#  define bool bool
# endif
# ifndef true
#  define true true
# endif
# ifndef false
#  define false false
# endif
#else
# include <stdbool.h>
#endif

/* Somewhere later in the code ... */
bool b = true;

이렇게하면 이전 버전의 C 용 컴파일러가 작동 할 수 있지만 코드가 최신 C 컴파일러로 컴파일 된 경우에는 앞으로 호환됩니다.

에 대한 자세한 내용은 typedef , 참조 형식 정의 에 대한 자세한 내용은 enum 를 참조 열거를



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow