检查“int”类型的“布尔”结果

Posted

技术标签:

【中文标题】检查“int”类型的“布尔”结果【英文标题】:Checking the "boolean" result of an "int" type 【发布时间】:2012-11-28 03:58:35 【问题描述】:

我正在学习 Java,来自 C,我发现 boolean 类型的语言之间存在有趣的差异。在 C 中没有bool/ean,所以我们需要使用数字类型来表示布尔逻辑(0 == false)。

我猜在 Java 中是行不通的:

int i = 1;
if (i)
    System.out.println("i is true");

也不会通过类型转换更改条件:

if ((boolean)i)

所以除了做类似的事情:

if ( i != 0 )

还有其他方法可以对 int 类型进行 C-ish 逻辑检查吗?只是想知道是否有任何 Java 技巧允许对此类非布尔类型进行布尔逻辑。


编辑: 上面的例子非常简单,而且思维范围很窄。当我最初问这个问题时,我也在考虑函数调用的非布尔返回。例如 Linux fork() 调用。它本身不返回int,但我可以很好地使用数字返回值作为条件:

if( fork() ) 
    // do child code

这允许我处理子条件中的代码,而不是为父处理(或在错误返回结果为负的情况下)。

所以我目前还没有足够的 Java 知识来给出一个好的“Java”示例,但这是我的初衷。

【问题讨论】:

没有。 (评论不要太短) @sampson-chen - 这是一个 int 的布尔值,我的是一个布尔值的 int ......或者你认为这个问题是一样的吗? @Mike 哎呀,抱歉;那是我的错误。 In C there is no bool - 呃,yes there is。 @BlueRaja-DannyPflughoeft -“C 中的标准类型,即不包括 ,不包括 bool 类型。” - 这样更好吗? 【参考方案1】:

在 Java 中,

if ( i != 0 )

是检查整数i 是否与zero 不同的惯用方法。

如果i 被用作标志,它应该是boolean 类型而不是int 类型。

【讨论】:

知道了,我想我将不得不习惯于不得不写所有这些额外的 (!=) 字符...谢谢! 我认为 real 成语是使用布尔值。以上是代码味道,恕我直言 只做逻辑时使用布尔值;当有一个实际有意义的数字时,做!= 0 如何通过(n & 1) 来检查是偶数还是奇数?最后贴上==!= 0?【参考方案2】:

为什么不使用boolean 类型?这将按您的预期工作,而不会出现可能有问题的整数/布尔合并。

private boolean isValid;
...
if (!isValid) 
   ...

请注意,这是惯用的 Java 方法。 3rd 方库使用它,您的 API 的消费者也会使用并期待它。我希望您使用的库可以为您提供booleans,因此您只需将ints 视为booleans

【讨论】:

我可以在这个简单的例子中。在更复杂的代码中,我知道我会本能地想要将 int 用作布尔值,因为我已经使用了这么多年了......只是想知道在 Java 中是否有什么语法可以允许它或者如果我只需要习惯这一点。 我会尝试解决您的本能冲动!整数与布尔值不同,如果你使用整数,总有一天你会在其中输入一个意想不到的值。 if you use an integer, one day you're going to put an unexpected value into it 完全正确。并为此 +1。然而,我在想的更多的是函数调用的返回。目前我没有一个好的“java”示例,但我正在考虑 Linux fork(),如果我不关心结果的值,我可以说if(fork()) 来涵盖这两种情况失败的分叉和父级以及条件内部的代码只是子级的。我喜欢能够做到这一点,即使它的可读性有点差。 @Mike:Java 不是 C。方法应该在成功时返回一个值,在失败时抛出异常不要使用int作为返回类型,除非你打算返回一个实际的数字... @thkala 是正确的,在 Java 环境中,其他开发人员会期望在失败的情况下出现异常,而不是“幻数”返回值;在调用堆栈上可以捕获异常,而不是检查特定的幻数。由于语言的规范(没有隐式布尔表示的整数)或语言中的附加功能(检查的异常),某些约定只是不会在语言之间转移。【参考方案3】:

您可以尝试类似的方法。 布尔 i = 真; 如果我) System.out.println("我是真的");

只需将其初始化为布尔值而不是整数。

【讨论】:

【参考方案4】:

来自JLS:

布尔类型有两个值,用布尔字面量表示 true 和 false,由 ASCII 字母组成。

因此答案是不。唯一的就是

if ( i != 0 )

【讨论】:

不错的链接... Oracle 是“官方”Java 文档的保管人? @Mike - 是的。 Sun 被甲骨文收购【参考方案5】:

在java中条件必须是布尔类型,否则不能是表达式,这就是为什么

if( i ) 

不允许。

它必须是真或假。

【讨论】:

【参考方案6】:

如果您坚持使用 int 而不是布尔值,只需 使用方法转换

class BooleanHelper

   public static boolean toBoolean (int pVal) 
      return pVal != 0;
   
 ...


// apply

if (BooleanHelper.toBoolean(i))  // BooleanHelper could be avoided using static imports...

但是,只需使用

if (i != 0) 

仍然更短更清晰。

【讨论】:

is still shorter and clearer. true,但我确实喜欢“助手”功能的概念,为此 +1。谢谢。 天哪,不要走这条路! Madness awaits!【参考方案7】:

从 Apache common-lang 尝试 BooleanUtils。

  BooleanUtils.toBoolean(0) = Boolean.FALSE
  BooleanUtils.toBoolean(1) = Boolean.TRUE
  BooleanUtils.toBoolean(2) = Boolean.TRUE

【讨论】:

【参考方案8】:

大概是这样的:

int i == 0 ? false : true;

或者反过来:

int i == 1 ? true : false

...

【讨论】:

以上是关于检查“int”类型的“布尔”结果的主要内容,如果未能解决你的问题,请参考以下文章

python基础数据类型一(整数类型和布尔值)

为啥我无法将程序中找到的布尔结果的正确值分配给布尔变量并使用结果检查条件?

第三天——整型和布尔值

JAVA中一个float除以一个int变量,得到的结果精确到几位?

检查以确保在执行之前至少进行了一次调用 - 此方法必须返回 int 类型的结果

在 postgresql 查询中检查布尔真/假结果