C ++에서 언제 bool을 사용해야합니까?


34

우리는 Tic-tac-toe 게임 을 만들어야하는 수업을 맡았 습니다. 사람들은 자신을 복잡하게 만들고 싶어서 메뉴가 포함 된 복잡한 게임을 썼습니다. 게임이 끝나면 다시 플레이하거나 프로그램을 종료 할 수있는 옵션이 있어야했습니다. 나는 그것을 위해 int변수를 사용 했지만 BOOL을 사용하는 일부 동급생을 발견했습니다.

더 효율적입니까? intbool에 저장 하는 것이 아니라 두 개의 값만 저장 해야하는 답변을 저장하는 것의 차이점은 무엇입니까 ? 이 변수의 정확한 목적은 무엇입니까?


32
효율성에 대해서는 확실하지 않지만 a의 목적은 int정수를 저장하는 것이며 a의 목적은 bool부울 값 ( true또는 false) 을 저장하는 것 입니다. boolIMO를 사용하면을 사용하는 것보다 훨씬 잘 사용 int됩니다.
George Duckett

12
실제로 C ++ 및 C99 이전에는 C89에 부울 형식이 없었습니다. 프로그래머는 종종 typedef int Bool부울을 사용하고 있음을 분명히하기 위해 사용합니다. boolC99가 (추악한) _Bool키워드로 C99와 마찬가지로 언어에 대한 C ++ 통합 지원 .
Charles Salvia

"사용시기 알기"가 아니라 bool유사한 유형 (예 :)의 이름이 다른 length_t이유와 컴파일러가 유형을 확인하는 것이 중요한 이유에 대한 것입니다.
Abyx

때때로 대답은 단지 '맛'입니다. 지금 당장 동일한 과제를 다시 작성하면 함수 매개 변수 순서 및 이름과 같은 여러 가지가 있습니다. 왜 같은 파라미터 순서 나 같은 이름을 쓰지 않았습니까? 그것은 당신이하지 않았거나 그다지 중요하지 않았고 당신이 무엇이든

답변:


82

변수 유형과 변수 이름을 선택할 때 가능한 한 명확한 의도를 원합니다. bool(부울) 유형 을 선택하면 허용 가능한 값이 두 개뿐입니다 ( true또는) false. 당신이 사용하는 경우 int(정수) 유형을, 그 변수의 의도는 1 개 또는 0 또는 당신이 무엇을 의미하는 선택 값이 될 수 있음을 더 이상 분명하지 true하고 false. Plus sizeof(int)는 일반적으로 4 바이트로 반환되는 반면 sizeof(bool)1을 반환합니다.


7
동의했다. 디자인 의도가 더 중요하다고 생각합니다. 가끔 만 재정의해야합니다.
ChrisF

9
@AndrewFinnel의 요점을 다시 말하면 : Bool은 더 많은 자기 문서화입니다. 0 또는 1로 설정 한 변수는 카운터 일 수 있습니다. true 또는 false로 설정 한 변수는 분명히 플래그입니다.
Scott C Wilson

2
부울은 다른 용도의 변수 남용을 방지합니다. 정수는 0 또는 1 이외의 값으로 설정하여 코드가 알지 못하는 추가 상태를 만들 수 있습니다.
Michael Shopsin

+1. 의도 / 옵션을 명확하게합니다. 값이 "yes"또는 "no"인 문자열을 포함하여 값을 저장하려는 모든 방법을 사용할 수 있지만 가장 의미있는 방법을 선택해야합니다. 이 경우 부울입니다.
Craige

C ++의 부울은 ints, 4 바이트와 같은 크기라고 생각했습니다.
DogDog

53

모든 (지금까지) 수집 된 답변에서 아무도 OP BOOL가하지 않았다는 사실을 알지 못했습니다 bool.

질문에 C ++ 태그가 지정되었으므로 다음 사항에 유의해야합니다.

  • int범위의 정수 INT_MININT_MAX정의 매크로 - <climits>그 값 호스팅 시스템의 아키텍처에 따라가. C ++에서이 값은 접근 또한 std::numeric_limits<int>::min()...:max()) 각각. 부울 연산자의 동작은 falseint처리 0하고 다른 모든 것은 true 로 처리하는 데 적용됩니다 .
  • BOOLint에 대한 부울 동작을 제안하는 힌트 일뿐입니다. 로 정의 <cstddef>됩니다

    #define BOOL int
    #define TRUE 1
    #define FALSE 0
    
  • BOOL컴파일러에 의해, 그것은 단지 int에 지나지 않습니다. 그것은 C 프로그래머가 사용하는 것이지만 C ++에는이므로 C ++ 프로그래머는 피해야 bool합니다.

  • bool그 지원되는 값 만있는 언어 통합 유형 truefalse. 로 변환 int true하면 1 false이되고 0이됩니다.

중요한 점은 프로그래밍 실수에 대해 더 안전하다는 것입니다.

BOOL a = FALSE;  // in fact int a = 0;
a = 5; //now a == 5 -- what does it mean?;

적절한 bool 유형으로 코딩 할 수 없습니다 :

bool a = false;
a = 5; // error: no bool(const int&) available.

BOOL대신에 사용 bool하는 것은 과거의 영광스러운 과거로부터 물려받은 나쁜 습관 일뿐입니다. 실제로 아무도 잊을 수 없기 때문에 덜 영광스러운 내일을위한 오래된 문제를 만듭니다.

언어 교사는 그것에 대해 진지하게 생각해야합니다!


9
BOOL은 C ++ 또는 C 언어의 일부가 아닙니다. 대문자가있는 BOOL은 C에 부울 유형이 없었던 시절에 C에서 부울을 구현 한 가장 일반적인 방법입니다. 예를 들어 Windows API는 BOOL을 정의합니다. 또한 BOOL이 어떻게 정의되는지 알려주지 않으며 일부 응용 프로그램에서는 BOOL을 1 비트 길이의 비트 필드로 정의 할 수 있습니다. 특정 라이브러리가 그렇게 정의했기 때문에 항상 int와 같다고 가정 할 수는 없습니다.

1
+1. 아마도 그는 실제로 평균 BOOL하지 BOOL을. 아마도 BOOL은 잠재적으로 다른 방식으로 구현 될 수 있지만 Codereview는 이러한 종류의 질문을하고 있는지 알지 못할 것입니다. 그는 그것이 int로 정의되어 있음을 알기 때문에 자연스럽게 int를 사용할 수없는 이유를 묻습니다.
Neil

1
@ 룬딘 : 일반적으로 당신은 맞지만, 이것은 OP가 BOOL과 int equivalence에 관해 말한 질문의 범위 안에 남는 대답이라고 생각하십시오.
Emilio Garavaglia

그럼에도 불구하고 BOOL 또는 bool을 사용하여 의도를 나타내는 아이디어는 여전히 적용됩니다.
Andrew T Finnell

1
@zvrba : 사실이지만, 이는 MS가 자체 컴파일러에서 bool을 구현하기로 결정한 방식 때문입니다. 인텔 프로세서에서 작동하는 MS 컴파일러에만 유효합니다. Intel 플랫폼의 경우 32 비트보다 짧은 모든 정수 유형에는 입력 또는 출력에 마스킹이 필요합니다. 그러나 char []는 여전히 사용되고 항상 int []로 대체 될 필요는 없다
Emilio Garavaglia

6

Bool 유형은 Int 유형보다 작으므로 메모리에서 더 적은 공간을 사용하십시오. 컴파일 / 컴파일하는 시스템에 따라 Int는 4-8 바이트가 될 수 있지만 Bool은 1 바이트입니다 ( 이 MSDN 기사 에서 볼 수 있음 )

이것을 KISS의 일부 측면 과 좋은 프로그램 디자인과 결합하면 부울을 사용하여 2 값만 갖는 변수를 저장하는 것이 더 나은 이유가 분명해집니다.

서로 다른 값 중 1 개만 저장하면된다고 확신 할 때 넓은 범위의 값을 저장할 수있는 객체와 사물을 지나치게 복잡하게 만드는 이유는 무엇입니까?

int를 사용하는 시스템에서 75를 저장하면 어떻게됩니까? 추가 조건을 추가 한 경우

if (value >= 0 )
  return true;  //value is greater than 0, thus is true
else
  return false; //value is 0 or smaller than 0, thus is false

또는

if (value == 0)
  return false;  //value is greater than 0, thus is true
else if (value == 1)
  return true; //value is 0 or smaller than 0, thus is false

이 상황에 대해 다루게됩니다. 그러나 그렇지 않은 경우에는 그렇지 않습니다.

버퍼 오버런이 발생하는 값 (int 값을 변경하는 방법에 따라 다름)과 값 "resets"를 다시 0 또는 int의 하한값 (어딘가에있을 수 있음) 대상 아키텍처에 따라 -127 ~ -9,223,372,036,854,775,808의 영역 ) 코드에서 어떤 일이 발생합니까?

그러나 부울을 사용하면 다음과 같이 사용할 수 있습니다.

if(continueBool == true)
  return true;
else
  return false;

또는:

return (continueBool== true) ? true : false;

또는:

return continueBool;

컴파일러에 따라 Bools를 사용하여 매핑 된 true / false 값을 저장하는 코드에서 수행 할 수있는 최적화가있을 수 있습니다. 반면 매핑 된 true / false 값을 저장하는 데 사용되는 Ints에 대해 수행 할 수있는 최적화가 없을 수 있습니다.

또한 C ++ (C, Assembly 및 FORTRAN과 함께)는 매우 효율적이고 작고 빠른 코드를 작성하는 데 사용된다는 것을 기억해야합니다. 따라서이 경우 Bool을 사용하는 것이 좋습니다. 특히 변수, 메모리, 캐시 또는 프로세서 시간 사용에 표시되어있는 경우에 특히 그렇습니다.

비슷한 질문입니다 : 왜 정수 (값)를 float에 저장합니까? 답 : 의미가 없기 때문에하지 말아야합니다.

간단히 말해 : 교사 / 교사 / 강사 / 교수는 다른 가치 유형의 크기 (당신이 그것을 놓친 경우)를 살펴보고 소프트웨어 개발에서 왜 중요한지에 대해 설명합니다.

나는 그것이 출발점으로 도움이되기를 희망합니다 (나는 또한 그것이 pedantic처럼 나오지 않기를 바랍니다)


4
if () 보너스 불필요 그냥 쓰기 return value >= 0;첫 번째 예를 들어.
zvrba

구문에 대한 OP의 이해 수준을 확신하지 못했습니다. 때때로 그것은 평상시보다 조금 더 장황하다고 보람을 느낀다-특히 OP가 배정이라고 언급 한 이후
Jamie Taylor

2
동의하지 않는 것이 아니라 int 대신 bool을 선택하여 3 바이트를 절약하는 것이 대부분의 프로그램에서 눈에 띄는 차이를 만들지 않을 것임을 지적합니다. 실제로 성능 문제가 발생할 때까지 효율성에 대해 걱정하지 마십시오!
James Anderson

@James : 또한 많은 경우에 다른 bool 또는 char이 아닌 한 다음 변수가 4 바이트 경계에 정렬되기 때문에 3 바이트를 절약하지 못합니다.
JeremyP

1

여기서의 목적은 의도의 명확성입니다. 리턴 타입은 함수 인터페이스의 일부이며 bool함수보다 함수에서 기대할 수있는 것에 대해 더 알려줍니다 int.

심지어 같은 유형이지만 적어도 당신의 의도를 보여 주지만, BOOL보다 표현력이 좋습니다 int.

그러나 그들 중 어느 것도 내가 권장하는 것은 아닙니다.

enum class UiCmd {QUIT, START_GAME};

-1

프로그래밍에서는 코드에서 실제 삶의 무언가를 표현하려고합니다. int와 bool이 동일한 작업을 수행 할 수 있음에도 불구하고 아 열한 아이디어는 완전히 다릅니다. bool을 사용할 때 대답은 예일 수도 있고 아닐 수도 있습니다. 그게 전부입니다. 그 의도입니다. 정수를 사용하면 소수점없이 수량 을 나타낼 수 있습니다 . 그리고 같은 정신으로, 왜 double이 같은 것을 할 수있을 때 정수를 선택하겠습니까? 문제를 모델링 할 때 정수가 double보다 더 의미가 있다면 int를 선택할 수 있습니다.


1
이것은 약 6 년 전에 게시 된 여기에 최고의 답변으로 만들어지고 설명 된 포인트를 넘어 실질적인 것을 제공하지 않는 것 같습니다
gnat

-2

결국, 당신은 어쨌든 정수를 불리언으로 변환 할 것입니다 : "if (i = 1) 그렇다면 다른 게임을하십시오". 이 상황에서 (i = 1)은 부울입니다.


어떤 컴퓨터에서 실행 중인지와 관련된 컴파일러에 따라 달라집니다. 부울 논리를 구현하는 가장 효율적인 방법은 "Y"또는 "N"이있는 단일 문자 플래그가 IBM 메인 프레임에서 배우는 것에 놀랄 수 있습니다.
제임스 앤더슨

4
참고로, if (i = 1)아마도 코드에서 가지고있는 것은 매우 잘못된 것입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.