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의 부울에 대한 몇 가지 생각 :
나는 int
typedef 또는 특별한 정의 또는 참 / 거짓 값에 대한 열거없이 평범한 부울 유형으로 일반을 사용하기에 충분히 나이가 들었습니다. 부울 상수와 비교하지 않는 아래의 제안을 따르는 경우 어쨌든 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이 아닙니다.
답변
내가 사용한 버전은 다음과 같습니다.
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;
}
답변
먼저 첫 번째 것들. 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
19 년 이내에 C를 배운 캐주얼 리더 bool
는 실제 bool
데이터 유형을 참조하고 비슷하게 동작 할 것으로 예상 하지만 그렇지 않습니다! 예를 들어
double a = ...;
bool b = a;
C99으로 bool
/ _Bool
, b
에 설정됩니다 false
IFF는 a
제로이었다 true
그렇지. C11 6.3.1.2p1
- 스칼라 값이로 변환 될 때 값이
_Bool
0과 비교되면 결과는 0입니다. 그렇지 않으면 결과는 1입니다. 59)각주
59) NaN은 0과 같지 않으므로 1로 변환됩니다.
으로 typedef
장소에서의이 double
강제 변환 될 수 int
의 두 배의 값이 범위 내에없는 경우는 – int
1, 행동이 정의되어 있지 않습니다 .
if true
및 false
에 선언 된 경우에도 동일하게 적용됩니다 enum
.
무엇 짝수 더 위험한를 선언한다
typedef enum bool {
false, true
} bool;
지금 때문에 모든 값이 1과 0 이외의 무효이고, 이러한 값은 해당 유형의 변수에 할당되어야 동작은 전체적으로 정의되지 않을 것이다 .
따라서 부적합한 변수에 대해 설명 할 수없는 이유로 C99를 사용할 수없는 경우 다음을 사용해야합니다.
- 입력
int
값0
과1
같은 -입니다 ; 이중 부정을 사용하여 다른 값에서이 값으로 도메인 변환을 신중하게 수행!!
- 또는 당신이 경우 주장 은 0, falsy 0이 아닌 truish 것을 기억하지 않는 이상 사용에서 대문자 그들이 C99 개념과 혼동되지 않도록하는 것이 :
BOOL
,TRUE
와FALSE
!
답변
typedef enum {
false = 0,
true
} t_bool;