【问题标题】:When are booleans better than integers?什么时候布尔值比整数更好?
【发布时间】:2011-05-30 12:31:32
【问题描述】:

在大多数编程语言中,可以使用10 代替TrueFalse。但是,根据我的经验,整数似乎总是更容易使用。

以下是我的意思的一些示例:

if x is True: x = False
else: x = True

x = abs(x-1)

__

if x is False: a = 0
else: a = 5

a = 5*x

在哪些情况下,布尔值比 1 或 0 更简单/更有效?

【问题讨论】:

  • 我敢肯定x = !xa = x ? 5 : 0 更容易
  • 我还要指出true 不一定是1。 IIRC,false 保证为0,但true 仅被定义为非假,更具体地说为~0 == 0xffffffff == -1,而不是1。假设true == 1 不是一个好主意。如果你想让你的真值是1,就用1,用整数;否则将您的布尔值用作布尔值,并且不要混合它们。
  • 如果你想使用 int 技巧来模拟布尔值,那么 x = 1 - xx = abs(x - 1) 更好。第一个例子真的很糟糕:将编写not 的糟糕方式与模仿not 的糟糕方式进行比较。

标签: boolean theory int


【解决方案1】:

对于高级语言中的布尔值,您应该始终使用任何布尔内置类型。如果 x 为真,但等于一个不同于 1 的值,那么您的第二个示例将是一个可怕的调试,并且对于任何不熟悉代码的开发人员来说都是一个棘手的问题 - 特别是那些不熟悉您的编码的开发人员风格。 怎么了

x = !x;

a = x ? 5 : 0;

【讨论】:

    【解决方案2】:

    在关系数据库中,整数可能比布尔值更有效的一个例子。位列通常无法被索引(我不一定代表该语句中的所有数据库,因此“通常”),因此如果需要索引,像 tinyint 这样的东西会更有意义。

    请记住,取决于用途和使用它的系统,虽然布尔值“占用更少空间”因为它只是一个位(取决于实现),但整数是硬件的本机字长. (某些系统可能会为布尔值使用完整的单词,当它实际在金属上运行时基本上不会节省空间,只是为了使用简单的单词大小。)

    在高级编程语言中,在布尔值和 int 之间进行选择实际上更多的是代码的可读性/可支持性,而不是效率。如果这些值确实限制为“真”或“假”,那么布尔值是有意义的。 (此模型是否处于给定状态,例如“有效”,或者不是?它永远不会是第三个选项。)另一方面,如果当前有两个选项,但 可能 有朝一日,使用布尔值(甚至只是“暂时”)可能很诱人,但使用 int(或枚举)从逻辑上讲更有意义。

    在代码中做“聪明”的事情时也要记住这一点。当然,做一些快速的 int 数学运算而不是使用布尔值可能看起来更时尚、更酷,但这对代码的可读性有什么影响呢?太聪明可能很危险。

    【讨论】:

    • 有趣的是,所选(也是最受好评的)答案没有回答问题,而是回答了问题的反面
    • @KevinDTimm:讽刺的是,我并没有忘记 :) 我认为这将是其他信息答案之一。
    【解决方案3】:

    为了可读性和良好的意图,为真/假选择布尔值总是更好。

    你知道你只有两个可能的选择。使用整数,事情会变得有点棘手,尤其是当你使用 0 作为假而其他任何东西都作为真时。

    使用整数表示真/假时可能会变得太聪明,所以要小心。

    使用布尔值会让 6 个月后的您和其他维护您的代码的人更清楚您的意图。您必须使用的大脑周期越少越好。

    【讨论】:

    • +1 用于提及可读性。几乎令人震惊的是,其他答案中很少有人能说明这一点。
    【解决方案4】:

    我会在您的示例中说布尔版本更具可读性(至少就您的意图而言)。这也取决于上下文。如果您为了进行微优化而牺牲了可读性,那就太糟糕了。

    【讨论】:

      【解决方案5】:

      我不确定效率,但在很多情况下我更喜欢布尔值。

      您的第一个示例可以很容易地写成 x = !xx = abs(x-1) 在我看来真的很晦涩。

      此外,当使用整数时,您无法确定 x 是 1 而不是 2 或 -5 或其他任何值。使用布尔值时,它总是只有 true 或 false。

      【讨论】:

        【解决方案6】:

        使用布尔值总是更有效,因为它更容易处理并且使用更少的处理/内存。尽可能使用布尔值

        【讨论】:

        • 我不同意。哪个更高效取决于编程语言、机器架构和您对“高效”的定义(您是指 CPU 处理时间还是内存使用量?)的组合。
        • 那是真的......我的编程经验有限,只使用 PHP/Java
        【解决方案7】:

        布尔值显然只能接受真/假或 0/1,不仅因为 Webnet 已经声明它们使用较少的处理能力和内存。

        【讨论】:

          【解决方案8】:

          抛开性能问题不谈,我认为布尔值和整数是编程中两个根本不同的概念。布尔表示条件,整数表示数字。如果您不严格保持整数布尔值 0 或不为 0,则很容易引入错误,当您可以只使用允许编译时安全性/类型检查的布尔值时,为什么还要为此烦恼?我的意思是,采取一种方法:

          doSomething(int param)
          

          方法本身 /not/ 暗示参数被解释为布尔值。没有人会阻止我将 1337 传递给它,也没有人会告诉我如果我这样做会发生什么 - 即使明确记录不要将 1337 值传递给方法(但只有 0 或 1),我仍然可以这样做它。如果你可以在编译时防止错误,你应该这样做。

          doSomething(bool 参数)

          只允许两个值:true 和 false,两者都不是错误的。

          另外,你关于为什么整数比布尔值更好的例子有点缺陷。

          if x is True: x = False
          else: x = True
          

          可以写成

          x != x
          

          而你的整数选择:

          x = abs(x-1)
          

          需要我知道:

          • x 可以有哪些可能的值
          • abs() 函数的作用
          • 为什么要从 x 中减去 1
          • 这实际上/做什么/。它有什么作用?

          你的第二个例子对我来说也很重要。

          if x is False: a = 0
          else: a = 5
          

          可以写成:

          a = (x) ? 5:0;

          而你的整数选择

          a = 5*x
          

          再次要求我知道:

          • 什么是 X?
          • X 可以是什么?
          • 如果 x = 10 会发生什么? -1? 2147483647?

          条件句太多。为可读性、常识和无错误、可预测的代码使用布尔值。

          【讨论】:

            【解决方案9】:

            我喜欢布尔值,可读性更强,而且你基本上已经强制与用户签订合同。

            例如"这些值只有 TRUE 或 FALSE"。

            【讨论】:

              猜你喜欢
              • 2011-09-27
              • 1970-01-01
              • 2016-12-10
              • 2012-07-24
              • 1970-01-01
              • 2012-05-29
              • 2011-05-12
              • 2010-12-08
              • 2012-02-08
              相关资源
              最近更新 更多