C의 부울 값 사용
C에는 내장된 부울 타입이 없습니다.C에서 사용하는 가장 좋은 방법은 무엇입니까?
최고에서 최악으로:
옵션 1(C99 이후)
#include <stdbool.h>
옵션 2
typedef enum { false, true } bool;
옵션 3
typedef int bool;
enum { false, true };
옵션 4
typedef int bool;
#define true 1
#define false 0
설명.
- 옵션 1은 C99(또는 그 이후)를 사용하는 경우에만 기능하며, 이 방법이 "표준 방법"입니다.가능하면 이 옵션을 선택합니다.
- 옵션 2, 3, 4는 실제로 동일한 동작을 합니다.근데 2번이랑 3번은 안 쓰는 게 더 좋은 것 같아요.
미정인 분은 1번으로!
C의 부울란에 대한 몇 가지 생각:
밋밋한 만 쓸 수 int한 정의 하지 않고 합니다.「 defs 」 true / false enums ums 。부울 상수와 비교하지 않는 방법에 대한 아래 제안사항을 따르면 플래그를 초기화하기 위해 0/1만 사용하면 됩니다.그러나 이러한 접근은 현대에 너무 반동적이라고 여겨질 수 있다.때는 꼭 하세요.<stdbool.h>적어도 표준화 될 수 있는 장점이 있기 때문입니다.
어떤 부울 상수가 호출되더라도 초기화에만 사용하십시오.절대 이런 거 쓰지 마
if (ready == TRUE) ...
while (empty == FALSE) ...
항상 더 깨끗한 것으로 대체할 수 있습니다.
if (ready) ...
while (!empty) ...
이것들은 실제로 합리적이고 이해할 수 있는 큰 소리로 읽을 수 있다는 점에 주의해 주세요.
에 양의 붙입니다. 즉, 부울 변수에는 양의 .fullnotfull이치노
if (full) ...
if (!full) ...
와 함께
if (!notfull) ...
if (notfull) ...
은 모두 자연스럽게, 의 쌍은 자연스럽게 읽는 이다.!notfull그대로 읽기가 불편하고, 복잡한 부울 표현에서는 훨씬 나빠집니다.
일반적으로 부울 인수는 피해야 합니다.다음과 같이 정의된 함수를 고려합니다.
void foo(bool option) { ... }
함수의 본문 내에서 인수의 의미는 매우 명확합니다.인수가 편리하고 의미 있는 이름을 가지고 있기 때문입니다.근데 콜사이트는
foo(TRUE);
foo(FALSE):
여기서 함수 정의 또는 선언을 항상 살펴보지 않고 매개 변수가 무엇을 의미하는지 확인하는 것은 기본적으로 불가능하며, 부울 매개 변수를 더 추가하면 더 나빠집니다.둘 중 하나를 제안합니다.
typedef enum { OPT_ON, OPT_OFF } foo_option;
void foo(foo_option option);
또는
#define OPT_ON true
#define OPT_OFF false
void foo(bool option) { ... }
어느 경우든 현재 콜사이트는
foo(OPT_ON);
foo(OPT_OFF);
는 적어도 그할 수 있는 .foo.
가장 중요한 것부터.C, 즉 ISO/IEC 9899는 지금까지 19년간 부울 타입을 가지고 있다.이는 이 질문을 방문했을 때 아마추어/학술/프로 파트를 합친 C 프로그래밍 커리어의 예상 기간보다 훨씬 긴 시간입니다.내 것은 그것을 불과 1~2년 정도 웃돈다.즉, 평균적인 독자가 C에 대해 배운 것이 전혀 없는 동안 C는 실제로 부울 데이터 타입을 가지고 있었습니다.
타입의 , 「」는 다음과 같습니다.#include <stdbool.h>및를 사용합니다.true,false ★★★★★★★★★★★★★★★★★」bool_Bool,1 ★★★★★★★★★★★★★★★★★」0★★★★★★ 。
이 문제에 대한 다른 답변에서는 다양한 위험 관행이 촉진됩니다.나는 그것들을 다룰 것이다:
typedef int bool;
#define true 1
#define false 0
을 예상할 수 안 . 왜냐하면 C를 19년 이내에 배운 평범한 독자는 그것을 예상할 것이기 때문이다.bool실제를 가리키다 bool데이터 유형 및 동작은 비슷하지만 그렇지 않습니다.를 들면, 「」
double a = ...;
bool b = a;
C99 우우 withbool_Bool,b로 설정됩니다.false iffiff( a0, 0, 0으로 되어 있습니다.true그렇지않으면.C11 6.3.1.2p1
- 의 스칼라 이 「」로 .
_Bool그렇지 않으면 1 . 59 0 0 、 1 . 59) 。각주
59) NaN은 0과 동일하지 않기 때문에 1로 변환됩니다.
★typedef제자리,doubleint-2의 에 int동작은 정의되어 있지 않습니다.
같은 입니다.true ★★★★★★★★★★★★★★★★★」false로 선언되었다.enum.
더 위험한 것은 이 사실을 선언하는 것이다.
typedef enum bool {
false, true
} bool;
1과 0 이외의 값은 모두 무효이며, 그러한 값이 해당 유형의 변수에 할당되면 동작은 완전히 정의되지 않습니다.
따라서 설명할 수 없는 이유로 C99를 사용할 수 없는 경우에는 부울 변수를 사용해야 합니다.
- 「」라고 입력합니다.
int값 및0★★★★★★★★★★★★★★★★★」1현재 상태, 그리고 이중 부정으로 다른 값에서 이 값으로 도메인 변환을 신중하게 수행합니다.!! - 또는 0이 거짓이고 0이 아닌 진실임을 기억하지 못할 경우 적어도 대문자만 사용하여 C99 개념과 혼동되지 않도록 하십시오.
BOOL,TRUE★★★★★★★★★★★★★★★★★」FALSE!
사용한 버전은 다음과 같습니다.
typedef enum { false = 0, true = !false } bool;
false는 값이 1개뿐이지만 논리적인 true는 여러 값을 가질 수 있지만 true는 false의 반대로 컴파일러가 사용하는 값으로 설정됩니다.
이렇게 하면 다음과 같은 문제를 해결할 수 있습니다.
if (true == !false)
그것이 좋은 방법이 아니라는 것은 우리 모두가 동의할 것이라고 생각합니다만, "참=!거짓"을 하는 데 드는 단 한 번의 비용으로 우리는 그 문제를 없앱니다.
[편집] 마지막으로 사용한 것은 다음과 같습니다.
typedef enum { myfalse = 0, mytrue = !myfalse } mybool;
스킴과의 true ★★★★★★★★★★★★★★★★★」false이치노
[EDIT] 정수를 부울로 변환하려면:
mybool somebool;
int someint = 5;
somebool = !!someint;
번째 오른쪽는하고 두 왼쪽) !는합니다.myfalse.
[EDIT] 디폴트값이 같아도 특정 값이 필요할 때 열거형 값의 명시적 설정을 사용하는 것이 제 스타일입니다.: false가 false를 사용합니다.false = 0,false,
[EDIT] gcc를 사용하여 컴파일할 때 열거형 크기를 제한하는 방법을 보여줍니다.
typedef __attribute__((__packed__)) enum { myfalse = 0, mytrue = !myfalse } mybool;
즉, 다음과 같은 경우:
struct mystruct {
mybool somebool1;
mybool somebool2;
mybool somebool3;
mybool somebool4;
}
구조의 크기는 16바이트가 아닌 4바이트가 됩니다.
C99 컴파일러를 사용하고 있는 경우는, Bool 타입을 서포트하고 있습니다.
#include <stdbool.h>
int main()
{
bool b = false;
b = true;
}
http://en.wikipedia.org/wiki/Boolean_data_type
C의 부울은 false의 경우 0, true의 경우 0이 아닌 정수입니다.
Boolean 데이터 유형, 섹션 C, C++, Objective-C, AWK를 참조하십시오.
0이 아닌 모든 것은 부울 연산에서 true로 평가되므로 다음과 같이 할 수 있습니다.
#define TRUE 1
#define FALSE 0
상수를 사용합니다.
C99를 사용할 수 있는 경우는, 다른 회답에 대한 보충과 설명에 지나지 않습니다.
+-------+----------------+-------------------------+--------------------+
| Name | Characteristic | Dependence in stdbool.h | Value |
+-------+----------------+-------------------------+--------------------+
| _Bool | Native type | Don't need header | |
+-------+----------------+-------------------------+--------------------+
| bool | Macro | Yes | Translate to _Bool |
+-------+----------------+-------------------------+--------------------+
| true | Macro | Yes | Translate to 1 |
+-------+----------------+-------------------------+--------------------+
| false | Macro | Yes | Translate to 0 |
+-------+----------------+-------------------------+--------------------+
제 취향은 다음과 같습니다.
_Bool★★★★★★★★★★★★★★★★★」bool다 둘 다 좋다bool좋다_Bool.- " "에 대해 값:
bool★★★★★★★★★★★★★★★★★」_Bool과 같습니다.false★★★★★★★★★★★★★★★★★」true의 할당.0★★★★★★★★★★★★★★★★★」1false★★★★★★★★★★★★★★★★★」true는 유효하지만 논리 플로우를 읽고 이해하기 어렵습니다.
표준 정보:
_Bool않다unsigned int단, 그룹 부호 없는 정수 타입의 일부입니다.값을 저장할 수 있을 정도로 큽니다.0★★★★★★★★★★★★★★★★★」1.- '예를 할 수 . 지만,, 시시시시시시 시시시시시시시
booltrue★★★★★★★★★★★★★★★★★」false되어 장래에입니다.이 능력은 청소년기로 간주되며 미래에 제거될 것입니다. - 스칼라 유형(산술 유형 및 포인터 유형) 할당
_Bool★★★★★★★★★★★★★★★★★」boolscalar 값이 다음과 같은 경우0해서 말할 수 있습니다.0그럴 것이다.0그렇지 않은 경우 결과는 다음과 같습니다.1_Bool x = 9;9is is is is is로 됩니다.1할당되어x. _Bool비트를 되지 않습니다.는 "(8비트)" 데이터입니다.일반적으로 프로그래머는 다른 비트를 사용하려고 하지만 권장되지 않습니다.왜냐하면 주어진 유일한 보증은 타입이 아닌1비트만 데이터 저장에 사용되기 때문입니다.char8시 정각
현재 C99는 부울 타입을 지원하지만#include <stdbool.h>.
예제:
#include <stdbool.h>
int main()
{
bool arr[2] = {true, false};
printf("%d\n", arr[0] && arr[1]);
printf("%d\n", arr[0] || arr[1]);
return 0;
}
출력:
0
1
C에는 부울 타입이 있습니다(최소 최근 10년간).
stdbool.h를 포함하면 true/false가 예상대로 작동합니다.
바로 이것입니다.
#define TRUE 1
#define FALSE 0
문자 또는 다른 작은 숫자 컨테이너를 사용할 수 있습니다.
의사 코드
#define TRUE 1
#define FALSE 0
char bValue = TRUE;
_Bool을 사용할 수 있지만 반환값은 정수여야 합니다(true의 경우 1, false의 경우 0).단, Daniweb 포럼의 이 답변과 마찬가지로 C++와 같이 bool을 포함시켜 사용하는 것이 좋습니다.또, 다음의 stackoverflow 질문의 답변도 추천합니다.
_Bool: C99의 부울 타입._Bool을 직접 사용하는 것은 이미 bool, true 또는 false 매크로를 정의한 레거시 코드를 유지하는 경우에만 권장됩니다.그렇지 않으면 이러한 매크로는 헤더로 표준화됩니다.이 헤더를 포함하면 C++에서처럼 bool을 사용할 수 있습니다.
사용하고 있는 것은 다음과 같습니다.
enum {false, true};
typedef _Bool bool;
_Bool는 CC.의입니다.부울값용입니다.
조건식은 0이 아닌 경우 true로 간주되지만, C 표준에서는 논리 연산자 자체가 0 또는 1을 반환해야 합니다.
@Tom: #define TRUE!FALSE는 나쁘고 전혀 의미가 없습니다.헤더 파일이 컴파일된 C++ 코드에 들어가면 다음과 같은 문제가 발생할 수 있습니다.
void foo(bool flag);
...
int flag = TRUE;
foo(flag);
일부 컴파일러는 int => bool 변환에 대한 경고를 생성합니다.경우에 따라서는 다음과 같은 방법으로 이를 회피할 수 있습니다.
foo(flag == TRUE);
강제로 C++ 부울로 표현합니다.그러나 #TRUE!FALSE를 정의하면 다음과 같은 결과가 됩니다.
foo(flag == !0);
결국 경고를 트리거할 수 있는 int-to-bool 비교를 하게 됩니다.
를 는, C99 를 할 수 ._Bool라고 입력합니다.아니요.#include는 필수입니다..1true ★★★★★★★★★★★★★★★★★」0false.
'보다 낫다'를 할 수 있습니다.TRUE ★★★★★★★★★★★★★★★★★」FALSE.
_Bool this_is_a_Boolean_var = 1;
//or using it with true and false
#define TRUE 1
#define FALSE 0
_Bool var = TRUE;
typedef enum {
false = 0,
true
} t_bool;
.#define뭇매를 맞다
#define TRUE 1
#define FALSE 0
#define NOT(arg) (arg == TRUE)? FALSE : TRUE
typedef int bool;
그리고 다음과 같이 사용합니다.
bool isVisible = FALSE;
bool isWorking = TRUE;
isVisible = NOT(isVisible);
등등
언급URL : https://stackoverflow.com/questions/1921539/using-boolean-values-in-c
'source' 카테고리의 다른 글
| beforeRouterEnter 가드에서 next()를 호출하는 방법 (0) | 2022.08.12 |
|---|---|
| Java에서 ==를 사용하여 플로트를 비교하는 것이 잘못된 점은 무엇입니까? (0) | 2022.08.11 |
| makefile의 CXX 값은 어디에서 얻을 수 있습니까? (0) | 2022.08.11 |
| Nuxt/Vue 반응체 속성 (0) | 2022.08.11 |
| vue-cli 설정 중 문제 발생 (0) | 2022.08.11 |