什么时候应该在C ++中使用布尔值?


34

我们为班级分配了一个作业,在那里我们必须创建一个Tic-tac-toe游戏。人们喜欢使自己复杂化,因此他们编写了包含菜单的复杂游戏。游戏结束时,您必须选择再次播放或退出程序。我int为此使用了一个变量,但我注意到一些同学在使用BOOL。

效率更高吗?将答案仅存储在一个值中int而不是将其存储在布尔值中,有什么区别?这些变量的确切目的是什么?


32
不确定效率,但是an的目的int是存储一个整数,而a的目的bool是存储一个布尔值(truefalse)。使用boolIMO比使用IMO更好地反映了它的使用int
乔治·达基特

12
实际上,在C ++和C99之前,C89没有布尔类型。程序员通常会typedef int Bool为了清楚表明自己正在使用布尔值。C ++集成bool了对该语言的支持,就像C99带有(而不是难看的)_Bool关键字一样。
Charles Salvia 2012年

这不是关于“知道何时使用bool”,而是关于为什么我们对相似​​类型(例如length_t)使用不同的名称,以及为什么编译器检查类型很重要。
Abyx 2012年

有时答案只是“品尝”。我敢打赌,如果您现在就重写相同的赋值,那么此时将有几处不同,例如函数参数顺序及其名称。为什么不以相同的参数顺序或相同的名称编写它?这是因为您只是没有,或者那不是很重要,您只是写了什么

Answers:


82

在选择变量类型和变量名称时,您希望您的意图尽可能清晰。如果选择bool(布尔)类型,则很明显只有两个可接受的值:truefalse。如果使用int(整数)类型,则不再清楚该变量的意图只能是1或0或您选择表示true和的任何值false。加号sizeof(int)通常返回为4字节,而sizeof(bool)返回1。


7
同意 我认为设计意图更为重要。仅偶尔需要覆盖它们。
克里斯·

9
重申@AndrewFinnel的观点:Bool更具自我记录能力。您设置为0或1的变量可能是一个计数器。设置为true或false的变量显然是一个标志。
Scott C Wilson

2
布尔避免了将变量滥用作其他用途。可以将整数设置为0或1以外的值,以创建代码可能不知道的其他状态。
Michael Shopsin'4

+1。它使意图/选项清楚。您可以使用任何一种方法来存储值,包括带有值“是”或“否”的字符串,但是您应该选择一种最有意义的方法。在这种情况下,这是布尔值。
Craige '04

我认为C ++中的布尔值与ints相同,为4个字节。
DogDog 2012年

53

在所有(直到现在)收集的答案中,似乎没有人发现OP所说的BOOL不是bool

由于该问题被标记为C ++,因此必须注意:

  • int是一个整数,范围从INT_MININT_MAX—宏,它们<climits>的值取决于主机的体系结构。在C ++中,这些值也可以分别通过std::numeric_limits<int>::min()和访问...:max()。布尔运算符的行为适用于int将其0视为false,并将其他所有内容视为true
  • BOOL只是暗示一个int的布尔行为。它定义<cstddef>

    #define BOOL int
    #define TRUE 1
    #define FALSE 0
  • BOOL无非就是语法糖,对于编译器而言,无非就是一个整数。这是C程序员使用的东西,但是C ++程序员应该避免使用,因为C ++具有bool

  • bool是一种语言整数类型,其支持值是just truefalse。转换int true为时变为1且false变为0。

重要的方面是它可以更安全地防止编程错误:

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

不能使用正确的布尔类型进行编码:

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

使用BOOL而不是bool光荣的过去没有人继承下来的坏习惯实际上仍然能够忘记,从而为一个光荣的明天创造了旧问题。

语言老师应该认真考虑一下!


9
BOOL不是C ++或C语言的一部分。带大写字母的BOOL是在C中实现布尔值的最常见方式,而在过去C时没有布尔值类型。例如,Windows API将定义BOOL。此外,并没有说明如何定义BOOL,某些应用程序可能会将其定义为一个1位长的位字段。您不能仅仅因为某些特定的库以这种方式定义它就总是等于int。

1
+1。也许他确实做了平均BOOL,而不是BOOL。BOOL可能以不同的方式实现,尽管Codereview可能不知道他是否在问这种问题。他看到它被定义为一个int,所以他自然地问为什么不能简单地使用int。
尼尔

1
@Lundin:一般而言,您是正确的,但请注意,这是一个超出问题范围的答案,OP在此讨论BOOL和int等效项。
Emilio Garavaglia'4

即使这样,使用BOOL或bool表示意图的想法仍然适用。
Andrew T Finnell

1
@zvrba:是的,但这是由于MS决定在自己的编译器中实现bool的方式。仅对适用于Intel处理器的MS编译器有效。请注意,对于Intel平台,每个小于32位的整数类型都需要对输入或输出进行屏蔽。但是char []仍然被使用,并不一定总是被int []取代
Emilio Garavaglia 2012年

6

布尔类型小于整数类型,因此使用较少的内存空间。根据您要在其上/针对其进行编译的系统,一个Int可以是4-8个字节,而一个Bool是1个字节(可以在此MSDN文章中看到)

将其与KISS的某些方面以及良好的程序设计结合起来,显而易见的是,为什么最好使用bool来存储只包含2个值的变量。

当您确定只需要存储2个不同值中的1个时,为什么将对象与可以存储各种值的对象过度复杂化?

如果在其中使用int的系统中存储75,在使用int的系统中会发生什么情况?如果您添加了额外的条件

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的值),其中您有一个缓冲区溢出,并且值“重新设置”回到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存储映射的真/假值的代码进行优化。而对于可能用于存储映射的真/假值的Ints可能无法执行优化。

我们还必须记住,C ++(以及C,Assembly和FORTRAN)用于编写高效,小型和快速的代码。因此,最好在这种情况下使用Bool-尤其是在标记了变量,内存,缓存或处理器时间的使用时。

一个类似的问题是:为什么我要在浮点数中存储一个整数(值)?答:您不应该这样做,因为没有意义。

长话短说:作为您的老师/教师/讲师/教授与您一起探讨不同价值类型的大小(以防万一您错过了它),以及为什么它们在软件开发中很重要。

我希望这可以作为一个起点(我也希望它不会像学徒一样出现)


4
不必要地使用if()奖励。仅写return value >= 0;第一个示例。
zvrba

我不确定OP对语法的理解程度。有时,它的回报是一个小更详细的比正常的-尤其是因为OP提到,这是一个任务
杰米·泰勒

2
并非不同意-只是指出通过在int上选择bool来节省三个字节不会对大多数程序产生任何明显的影响。在您确实遇到性能问题之前,不必担心效率!
詹姆斯·安德森

@James:在很多情况下,您也不会保存三个字节,因为下一个变量(除非是另一个布尔值或字符)可能会与四个字节的边界对齐。
JeremyP 2012年

1

此处的目的是明确意图。返回类型是函数接口的一部分,并且a与n相比,可以bool告诉您更多关于函数的期望int

即使BOOL与相比int,它的表现力也要好,尽管它至少是同一类型,但至少可以表明您的意图。

但是,这些都不是我建议的:

enum class UiCmd {QUIT, START_GAME};

-1

在编程中,您想代表代码中的真实生活。尽管int和bool可以做到相同,但次要思想却完全不同:使用bool时,答案可能是肯定或否定;仅此而已,这就是意图。使用整数,您可能表示不带小数点的数量。并且本着同样的精神,当双精度型可以做同样的事情时,为什么还要选择一个整数呢?如果在对问题进行建模时,整数比双数有意义,那么您可以选择一个整数。


1
这似乎并没有提供任何实质性超过制成,在这里最多的回答解释点这是6年前发布有关
蚊蚋

-2

因为最后,您无论如何都要将整数转换为布尔值:“如果(i = 1),则再玩另一个游戏”。在这种情况下(i = 1)转换为true或false:布尔值。


很大程度上取决于您在哪台计算机上运行以及所涉及的编译器。您可能会惊讶地发现,在IBM大型机上,带有“ Y”或“ N”的单个字符标志是实现布尔逻辑的最有效方法。
詹姆斯·安德森

4
值得注意的if (i = 1)是,在自己的代码中可能是非常错误的事情。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.