【问题标题】:Why boolean in Java takes only true or false? Why not 1 or 0 also?为什么Java中的布尔值只接受真或假?为什么不是 1 或 0 呢?
【发布时间】:2011-01-02 04:07:50
【问题描述】:

为什么 Java 布尔值只采用 truefalse 为什么不采用 10 有什么原因?

【问题讨论】:

  • 不是一个复杂的问题,但我也认为没有理由投反对票。
  • 你忘了FILE_NOT_FOUND
  • 在java中,只能使用“true”和“false”来判断布尔条件。您不能像在 C 和 C++ 中那样使用其他原始类型作为默认的“true”或“false”。
  • 因为是这样定义的。 'nuff 说。
  • 为了解决这个问题,我使用了boolean bValue = Integer.valueOf(strValue) > 0;

标签: java boolean


【解决方案1】:

在 C 和 C++ 中,没有称为 boolean 的数据类型。这就是为什么它使用 1 和 0 作为 truefalse 值的替换。

在 Java 中,1 和 0 的类型为 int(整数),因此会产生错误。 Java 也有自己的布尔值(truefalse),具有自己的布尔数据类型。

【讨论】:

  • C++ 有一个bool 类型,而truefalse 是关键字。 C11有_Bool,也可以#include <stdbool.h>得到bool。不同之处在于整数和指针类型可以隐式转换为布尔值,因此您可以编写bool condition = a 而不是bool condition = (a!=0);。或if(a){}
【解决方案2】:

具体说明这一点使您远离整个 TRUE 在 VB 中是 -1,而在其他语言中,true 只是非零。将布尔字段保持为 true 或 false 使 java 不在此参数范围内。

【讨论】:

    【解决方案3】:

    因为创建 Java 的人希望 boolean 表示明确的真或假,而不是 1 或 0。

    对于 1 和 0 如何转换为布尔值,语言之间没有达成共识。 C 使用任何非零值表示真,使用 0 表示假,但某些 UNIX shell 则相反。使用 int 会削弱类型检查,因为编译器无法防范传入的 int 值不应该在布尔上下文中使用的情况。

    【讨论】:

    • 最后一段实际上是在讨论布尔如何转换为int,而不是相反。是的,在 C 中 int foo = (a!=b); 将是 0 或 1。但在 C 中,任何非 0 值在布尔上下文中都是“真”。 if(foo) 不检查foo==1,它检查foo!=0。所以如果你写if(foo),编译器肯定会处理它。只有当您执行_Bool equal = a & b 之类的操作时才会遇到麻烦,因为4 & 2 == 0 即使它们都是真的。我想这就是你想要表达的观点。
    【解决方案4】:

    即使 C++ 中有 bool(布尔的缩写)数据类型。但在 C++ 中,任何非零值都是 true 值,包括负数。 0(零)被视为 false。在 JAVA 中,truefalse 有一个单独的布尔数据类型。

    【讨论】:

      【解决方案5】:

      因为布尔值有两个值:truefalse。请注意,这些不是字符串,而是实际的布尔文字。

      1 和 0 是整数,没有理由通过将它们设置为“另一种正确”和“另一种错误”来混淆事物(或者对于那些习惯于 Unix 退出代码的人来说,反过来呢?)。在 Java 中使用强类型时,应该只有两个原始布尔值。

      编辑:请注意,如果需要,您可以轻松编写转换函数:

      public static boolean intToBool(int input)
      {
         if (input < 0 || input > 1)
         {
            throw new IllegalArgumentException("input must be 0 or 1");
         }
      
         // Note we designate 1 as true and 0 as false though some may disagree
         return input == 1;
      }
      

      虽然我不会推荐这个。请注意,您如何不能保证 int 变量确实是 0 或 1;并且没有 100% 明显的语义来说明什么是真实的。另一方面,boolean 变量 总是 要么是 true 要么是 false ,很明显哪个是真的。 :-)

      因此,不要使用转换函数,而是习惯于使用boolean 变量来表示代表真/假概念的所有内容。如果您必须使用某种原始文本字符串(例如用于存储在平面文件中),“true”和“false”的含义要清楚得多,并且可以通过库方法Boolean.valueOf 立即转换为布尔值。

      【讨论】:

      • +1:同理,“x”不是数字,123 不是日期。
      • 具体说明这一点使您远离整个 TRUE 在 VB 中是 -1,而在其他语言中,true 只是非零。将布尔字段保持为 true 或 false 将 java 保留在此参数之外。
      【解决方案6】:

      其他答案没有指出的一件事是,不将整数视为真值的一个优点是它避免了这种 C/C++ 错误综合症:

      int i = 0;
      if (i = 1) {
          print("the sky is falling!\n");
      } 
      

      在 C / C++ 中,错误地使用 = 而不是 == 会导致条件意外地评估为“真”并更新 i 作为意外的副作用。

      在 Java 中,这是一个编译错误,因为赋值 i = 1 的值具有类型 int 并且此时需要 boolean。在 Java 中遇到麻烦的唯一情况是编写这样的蹩脚代码:

      boolean ok = false;
      if (ok = true) {  // bug and lame style
          print("the sky is falling!\n");
      }
      

      ...任何有一点“品味”的人都会写成...

      boolean ok = false;
      if (ok) {
          print("the sky is falling!\n");
      }
      

      【讨论】:

        【解决方案7】:

        关于相关说明:java 编译器使用 int 来表示 boolean,因为 JVM 对 boolean 类型的支持有限。请参阅 Section 3.3.4 The boolean type

        在JVM中,整数0表示false,任何非零整数表示true (来源:Inside Java Virtual Machine by Bill Venners)

        【讨论】:

        • 这在三个方面在技术上是不正确的。 1) Java 编译器不“表示”布尔值。它生成字节码。 2)字节码处理的东西是对象字段、抽象栈槽和数组中的槽。在某些情况下,保存boolean 值的槽映射到 32 位字(在典型的 JVM 实现中),但这并不意味着 JVM 将它们视为ints。 3)在boolean[]中,用于容纳一个元素的槽是8位,而不是32位。
        • 我也会警惕依赖教科书作为这方面的来源。最终的来源是 JVM 规范所说的,而不是某些作者为了让目标读者可以理解而对其进行的“旋转”。 (我没读过这本书,所以不要把这当成是对它的批评。这只是一个警告......)
        • @StephenC “Java 编程语言中对布尔值进行操作的表达式被编译为使用 Java 虚拟机 int 数据类型的值”docs.oracle.com/javase/specs/jvms/se8/html/…
        • 同一部分还说:“Java 虚拟机使用 1 表示真和 0 表示假对布尔数组组件进行编码。其中 Java 编程语言的布尔值由编译器映射到Java 虚拟机类型 int,编译器必须使用相同的编码。” - 第一句直接与 Bill Venners 的引用相矛盾。第二句话有一个有趣的细微差别......
        • 细微差别在于它并不是说 Java 编译器必须使用 JVM int 类型来表示 Java boolean 类型。此外@mdewit,您引用的文本 1) 实际上仅适用于表达式,并且 2) 是描述性的而不是规定性的。 (并不是说 Java 编译器必须编译成 JVM int 类型。)
        【解决方案8】:

        与 C 和 C++ 等语言不同,Java 将 boolean 视为具有 2 个不同值的完全独立的数据类型:true 和 false。值 1 和 0 是 int 类型,不能隐式转换为 boolean

        【讨论】:

        • 在JVM层面,boolean、byte、short、char、int都被视为int,boolean确实是用0和1表示的。所以“不可隐式转换”在Java仅限语言水平。
        • 另外,Java 公开地尝试从过去学习,以便删除所有类别的错误。例如范围从小特征(无隐式布尔表达式)到大特征(垃圾收集)
        • 继续 Chris 的观点,写成 char x = (char) 88945; 是合法的;或 char y = (char) -489;.
        • C 原本没有 bool 类型,所以你必须使用 0 或 1。
        • 你没有真正回答这个问题。他们问为什么
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 2014-09-07
        • 1970-01-01
        • 2011-02-25
        相关资源
        最近更新 更多