Program Tip

C에서 참과 거짓 사용

programtip 2020. 12. 10. 21:00
반응형

C에서 참과 거짓 사용


내가 볼 수있는 한 c에서 부울을 사용하는 세 가지 방법이 있습니다.

  1. bool 유형으로 그때부터 true와 false를 사용합니다.
  2. 전처리기를 사용하여 정의 #define FALSE 0 ... #define TRUE !(FALSE)
  3. 상수를 직접 사용하기 위해, 즉 1과 0

내가 놓친 다른 방법이 있습니까? 다른 방법의 장단점은 무엇입니까?

가장 빠른 것은 3 번이고, 2는 여전히 더 쉽게 읽을 수 있습니다 (비트 부정은 오버 헤드에 약간 추가되지만), 1은 모든 컴파일러와 호환되지 않는 가장 읽기 쉽습니다.


<stdbool.h>시스템에서 제공하는 경우 포함 하십시오. 즉 포함한 매크로의 수를 정의하고 bool, false그리고 true(정의 _Bool는 각각 0, 1). 자세한 내용은 C99의 7.16 섹션을 참조하십시오.


코드에서 직접 0 또는 1을 사용하십시오.

C 프로그래머에게 이것은 참 또는 거짓처럼 직관적입니다.


나는 일반적으로 다음을 수행합니다.

typedef enum {FALSE = 0, TRUE} boolean;

stdbool.h 정의 된 bool 유형을 사용하면 bool 유형을 지원하는 최신 컴파일러에서 이전 컴파일러로 코드를 이동해야 할 때 문제가 발생합니다. 이는 이전 버전의 사양을 기반으로하는 C 컴파일러를 사용하여 새 아키텍처로 이동할 때 임베디드 프로그래밍 환경에서 발생할 수 있습니다.

요약하면 이식성이 중요 할 때 매크로를 고수 할 것입니다. 그렇지 않으면 다른 사람들이 권장하는 것을 수행하고 bulit in type을 사용하십시오.


세 가지 중 어느 쪽을 사용하든 변수를 FALSE 또는 false와 비교하십시오.

역사적 으로 c 또는 c ++에서 어떤 것을 참 (1)과 비교하는 것은 나쁜 생각 입니다. 거짓 만 0이 보장됩니다. True는 다른 값 입니다. 많은 컴파일러 공급 업체의 헤더에 이러한 정의가 있습니다.  

#define TRUE 1
#define FALSE 0

이것은 너무 많은 사람들을 정원 길로 이끌었습니다. char유형 이외의 많은 라이브러리 함수 1는 성공시와 같지 않은 0이 아닌 값을 반환합니다 . 동일한 동작을 가진 많은 레거시 코드가 있습니다.


bool이 c99 stdbool.h에 정의되어 있는지 테스트 할 수 있습니다.

#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0
//typedef or define here
#endif

나는 1로 갈 것입니다. 나는 그것과 비 호환성을 만나지 않았고 더 자연 스럽습니다. 하지만 C 표준이 아닌 C ++의 일부라고 생각합니다. 정의 또는 세 번째 옵션을 사용한 더티 해킹은 성능을 얻지 못하지만 코드를 유지하는 데 어려움이있을 것이라고 생각합니다.


나는 변수를 정의 할 때 (1)을 선호하지만 표현식에서는 절대로 true와 false를 비교하지 않고 if (flag) 또는 if (! flag) 또는 if (ptr)의 암시 적 C 정의를 사용합니다. 그것이 일을하는 C 방식입니다.


0이 아닌 모든 int는 true입니다. 거짓은 0입니다. 이렇게하면 다음과 같은 코드가 예상대로 계속 작동합니다.

int done = 0;   // `int` could be `bool` just as well

while (!done)
{
     // ...
     done = OS_SUCCESS_CODE == some_system_call ();
}

IMO bool는 과대 평가 된 유형이며 아마도 다른 언어에서 이월 된 것입니다. int부울 유형으로 잘 작동합니다.


실제 속도 차이는 없습니다. 그것들은 실제로 컴파일러와 동일합니다. 차이점은 인간이 코드를 사용하고 읽는 데 있습니다.

저에게는 bool, true 및 false가 C ++ 코드에서 가장 좋은 선택입니다. C 코드에는 bool을 지원하지 않는 컴파일러가 있기 때문에 (종종 오래된 시스템에서 작업해야 함) 어떤 상황에서는 정의를 사용할 수 있습니다.


1은 모든 컴파일러와 호환되지 않는 가장 읽기 쉽습니다.

ISO C 컴파일러에는 bool. ISO C99 컴파일러에는 type _Bool, typedef의 헤더가 bool있습니다. 따라서 호환성은 컴파일러가 C99와 호환되지 않는 경우 (예 : VC ++) 자체 헤더를 제공하는 경우입니다.

물론 더 간단한 방법은 C 코드를 C ++로 컴파일하는 것입니다.


조건이 참인지 거짓인지 테스트해야 할 때 특히 유용하기 때문에 1과 0을 사용하는 세 번째 솔루션을 선호합니다. if 인수에 변수를 사용할 수 있습니다.
다른 방법을 사용하는 경우 나머지 코드와 일관성을 유지하려면 다음과 같은 테스트를 사용해야한다고 생각합니다.

if (variable == TRUE)
{
   ...
}

대신에:

if (variable)
{
   ...
}

I used to use the #define because they make code easier to read, and there should be no performances degradation compared to using numbers (0,1) coz' the preprocessor converts the #define into numbers before compilation. Once the application is run preprocessor does not come into the way again because the code is already compiled.

BTW it should be:

#define FALSE 0 
#define TRUE 1

and remember that -1, -2, ... 2, 3, etc. all evaluates to true.


I don't know you specific situation. Back when I was writing C programs, we have always used #2.

#define FALSE = 0
#define TRUE = !FALSE

This might be otherwise under alien platform to DOS or Intel-based processors. But I used to use both C and ASM together writing graphic libraries and graphical IDE. I was a true fan of Micheal Abrash and was intending to learn about texture mapping and so. Anyway! That's not the subject of the question here!

This was the most commonly used form to define boolean values in C, as this headerfile stdbool.h did not exist then.


I prefer to use

#define FALSE (0!=0) 
#define TRUE  (0==0)

or directly in the code

if (flag == (0==0)) { ... }

The compiler will take care of that. I use a lot of languages and having to remember that FALSE is 0 bothers me a lot; but if I have to, I usually think about that string loop

do { ... } while (*ptr);

and that leads me to see that FALSE is 0

참고URL : https://stackoverflow.com/questions/2254075/using-true-and-false-in-c

반응형