[c] 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은 #defines를 사용하지 않습니다. 제 생각에는 더 좋습니다.

당신이 미정이라면, 1 번으로 가십시오!


답변

C의 부울에 대한 몇 가지 생각 :

나는 inttypedef 또는 특별한 정의 또는 참 / 거짓 값에 대한 열거없이 평범한 부울 유형으로 일반을 사용하기에 충분히 나이가 들었습니다. 부울 상수와 비교하지 않는 아래의 제안을 따르는 경우 어쨌든 0/1 만 사용하여 플래그를 초기화해야합니다. 그러나 이러한 접근은 현대에 너무 반동적 인 것으로 간주 될 수 있습니다. 이 경우에는 반드시<stdbool.h> 최소한 표준화의 이점이 있으므로 합니다.

부울 상수가 무엇이든, 초기화에만 사용하십시오. 절대로 같은 것을 쓰지 마십시오

if (ready == TRUE) ...
while (empty == FALSE) ...

이것들은 항상 더 선명한 것으로 대체 될 수 있습니다

if (ready) ...
while (!empty) ...

이것들은 실제로 합리적이고 이해하기 쉽게 소리내어 읽을 수 있습니다.

부울 변수에 긍정적 인 이름을 지정하십시오 (예 : full대신) notfull. 후자는 쉽게 읽기 어려운 코드로 이어집니다. 비교

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의 부울은 정수입니다. false는 0이고 true는 0이 아닙니다.

참조 Boolean 데이터 유형 , 섹션 C, C ++를 목표 – C, AWK .


답변

내가 사용한 버전은 다음과 같습니다.

typedef enum { false = 0, true = !false } bool;

false는 하나의 값만 갖지만 논리적 true는 많은 값을 가질 수 있지만 기술은 true를 컴파일러가 false와 반대로 사용할 것으로 설정합니다.

이것은 누군가가 다음과 같은 것을 코딩하는 문제를 처리합니다.

if (true == !false)

나는 이것이 좋은 습관이 아니라는 것에 동의 할 것이지만, “true =! false”를 수행하는 한 번의 비용으로 그 문제를 제거합니다.

[편집] 결국 나는 사용했다 :

typedef enum { myfalse = 0, mytrue = !myfalse } mybool;

정의 true하고 있던 다른 체계와 이름 충돌을 피하기 위해false . 그러나 개념은 동일합니다.

[편집] 정수를 부울로 변환하는 방법 :

mybool somebool;
int someint = 5;
somebool = !!someint;

첫 번째 (가장 오른쪽)! 0이 아닌 정수를 0으로 변환 한 다음 두 번째 (가장 왼쪽)! 0을 myfalse값으로 변환합니다 . 독자가 제로 정수를 변환하는 연습으로 남겨 두겠습니다.

[편집] 기본값이 같더라도 특정 값이 필요할 때 열거 형에 값을 명시 적으로 설정하는 것이 내 스타일입니다. 예 : false는 0이어야하기 때문에 false = 0,대신 사용하십시오.false,


답변

C99 컴파일러를 사용하는 경우 bool 유형을 기본적으로 지원합니다.

#include <stdbool.h>
int main()
{
  bool b = false;
  b = true;
}

http://en.wikipedia.org/wiki/Boolean_data_type


답변

먼저 첫 번째 것들. C, 즉 ISO / IEC 9899는 현재 19 년 동안 부울 유형이었습니다 . 이 질문을 방문 할 때 아마추어 / 학술 / 전문 부품이 결합 된 C 프로그래밍 경력 의 예상 시간보다 더 긴 시간 입니다. 광산은 아마도 1-2 년 정도를 능가합니다. 그것은 평균적인 독자가 C에 대해 전혀 아무것도 배우지 않았을 때 C는 실제로 부울 데이터 유형을 가졌음을 의미합니다 .

데이터 유형에 대해서는 #include <stdbool.h>, 사용 true, falsebool. 아니면, 사용에 포함되지 않습니다 _Bool, 1그리고 0대신합니다.


이 스레드에 대한 다른 답변에서 다양한 위험한 관행이 촉진됩니다. 나는 그것들을 다룰 것이다 :

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

19 년 이내에 C를 배운 캐주얼 리더 bool실제 bool 데이터 유형을 참조하고 비슷하게 동작 할 것으로 예상 하지만 그렇지 않습니다! 예를 들어

double a = ...;
bool b = a;

C99으로 bool/ _Bool, b에 설정됩니다 false IFF는 a 제로이었다 true그렇지. C11 6.3.1.2p1

  1. 스칼라 값이로 변환 될 때 값이 _Bool0과 비교되면 결과는 0입니다. 그렇지 않으면 결과는 1입니다. 59)

각주

59) NaN은 0과 같지 않으므로 1로 변환됩니다.

으로 typedef장소에서의이 double강제 변환 될 수 int의 두 배의 값이 범위 내에없는 경우는 – int1, 행동이 정의되어 있지 않습니다 .

if truefalse에 선언 된 경우에도 동일하게 적용됩니다 enum.

무엇 짝수 더 위험한를 선언한다

typedef enum bool {
    false, true
} bool;

지금 때문에 모든 값이 1과 0 이외의 무효이고, 이러한 값은 해당 유형의 변수에 할당되어야 동작은 전체적으로 정의되지 않을 것이다 .

따라서 부적합한 변수에 대해 설명 할 수없는 이유로 C99를 사용할 수없는 경우 다음을 사용해야합니다.

  • 입력 int01 같은 -입니다 ; 이중 부정을 사용하여 다른 값에서이 값으로 도메인 변환을 신중하게 수행!!
  • 또는 당신이 경우 주장 은 0, falsy 0이 아닌 truish 것을 기억하지 않는 이상 사용에서 대문자 그들이 C99 개념과 혼동되지 않도록하는 것이 : BOOL, TRUEFALSE!

답변

typedef enum {
    false = 0,
    true
} t_bool;