source

C의 부울 값 사용

goodcode 2022. 8. 11. 22:19
반응형

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

  1. 의 스칼라 이 「」로 ._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.
  • '예를 할 수 . 지만,, 시시시시시시 시시시시시시시bool true ★★★★★★★★★★★★★★★★★」false되어 장래에입니다.이 능력은 청소년기로 간주되며 미래에 제거될 것입니다.
  • 스칼라 유형(산술 유형 및 포인터 유형) 할당_Bool ★★★★★★★★★★★★★★★★★」boolscalar 값이 다음과 같은 경우0해서 말할 수 있습니다.0그럴 것이다.0그렇지 않은 경우 결과는 다음과 같습니다.1_Bool x = 9; 9 is 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

반응형