수색…
비고
미리 정의 된 _Bool
및 헤더 <stdbool.h>
사용하려면 C의 C99 / C11 버전을 사용해야합니다.
컴파일러 경고 및 오류가 발생하지 않도록하려면 C89 및 이전 버전의 언어를 사용하는 경우 typedef
/ define
예제 만 사용해야합니다.
stdbool.h 사용하기
시스템 헤더 파일 stdbool.h
사용하면 bool
을 부울 데이터 유형으로 사용할 수 있습니다. true
는 1
평가되고 false
는 0
평가됩니다.
#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
로, 정수 값 0
을 false
로 효과적으로 처리합니다. 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
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
이면z
가0
됩니다. 그렇지 않으면z
는1
됩니다. -
X
에 포인터 유형이 있으면X
가 널 포인터이면z
가0
이되고 그렇지 않으면1
됩니다.
더 좋은 철자 bool
, false
및 true
를 사용하려면 <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
를 참조 열거를