Java多个三元运算符

4

我目前正在学习一些Java,遇到了以下代码片段。我知道如何使用典型的三元运算符(例如下面以“boolean a”开头的行),但我不知道如何阅读以“boolean b”开头的行中的表达式。如果有任何帮助来解读这一行的内容,将不胜感激!谢谢!

public class Ternary{
    public static void main (String[] args){
        int x = 10;
        int i = 2;
        boolean a = x > 10 ? true: false;
        boolean b = a = true ? ++i > 2 ? true:false:false;
        System.out.print(b);
    }
}

2
浏览运算符优先级的详细信息:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html。我为你感到难过——那段代码很深奥。 - La-comadreja
三元运算符的格式如下(condition ? condition为真时的结果 : condition为假时的结果)。因此,在这里,我们定义布尔变量a,然后将其赋值为三元运算符的结果。 - Ali Cheaito
8个回答

6

把它分成这样:

true ? (++i > 2 ? true 
                : false)
     : false;

这里的测试条件始终设置为true。所以执行三元运算符的分支是++i > 2 ? true : false部分。
这只是简单地检查i增加后是否大于2。如果是,则返回true。否则,返回false
实际上,整个表达式是不必要复杂的。可以简单地写成这样:
boolean b = a = (++ i > 2);

然而,这段代码可能在逻辑上是错误的,因为这个晦涩的表达并没有太多意义。由于前一行设置了a的值,我认为下一行实际上是想测试a。因此,实际意图可能是:

boolean b = a == true ? ++i > 2 ? true : false : false; //notice the ==

在这种情况下,您可以将其分解为以下几个部分:
(a == true) ? (++i > 2 ? true
                       : false)
            : false;

但实际上你不需要执行 a == true,因为 a 已经是一个 boolean 类型,所以可以这样写:

a ? (++i > 2 ? true
             : false)
  : false;

这里,它检查 a 是否为 true,如果是,则执行我们已经了解过的检查(即检查增量值的 i 是否大于 2),否则返回 false
但是即使这个复杂的表达式也可以简化为:
boolean b = a && (++i > 2);

关于最后一个 false 是怎么样的呢?它是不是做一个真值表 T v F = T? - Engineer2021
在这种情况下,最后一个“false”永远不会被评估,因为测试始终为“true”。 - Vivin Paliath
1
感谢Vivin(以及其他所有人)的解释。实际上,这段代码来自一个样例OCJA考试,这可能解释了为什么它被编写得如此不必要地复杂。再次感谢! - John Kilo
现在我已经因为第一个提到 b = a = true不正确的而在我的删除问题上得到了-3分。请看一下您在Rohit Jain的回答下面的评论... - Saro Taşciyan
@Zefnus 我的意思是代码可以编译通过。但是,这样说并没有太多意义。 - Vivin Paliath

1

啊!永远不要编写这样的代码。但我想你不是编写者。你可以这样阅读它:

// I assume that's `a == true` instead of `a = true`
boolean b = a == true ? (++i > 2 ? true : false)
                      : false;

这可以进一步分解为:
// a == true is better written as just `a`. You shouldn't do boolean comparison
// like that.
boolean b = a ? (++i > 2) : false;

// If that is really a = true, then you can break it as:
boolean b = a = true ? (++i > 2) : false;

这可以进一步分解为:
// If that is `a == true`
boolean b = a && (++i > 2)

// If that is really a = true, then you can break it as:
boolean b = a = (++i > 2);

另外,第一个任务:

boolean a = x > 10 ? true: false;

可以这样写:

也可以写成:

boolean a = x > 10;

我认为这不正确。boolean b = a = true 是正确的;它只是将结果分配给了 ab 两个变量。 - Vivin Paliath
a == true 不是太好,但它不会将 true 分配给 a。 - Gábor Bakos
FYI,IntelliJ 简化为 boolean b = a = ++i > 2; - Arnaud Denoyelle
@GáborBakos 我知道 a == true 不太好。请看我的更新答案。 - Rohit Jain
@GáborBakos 我猜IntelliJ将 true? X :Y 简化为 X,然后将 X ? true: false 也简化为 X - Arnaud Denoyelle
显示剩余2条评论

1
boolean nu = f=='f' && t=='f'; //0
boolean ei = f=='f' && t=='t'; //1
boolean zw = f=='t' && t=='f'; //2
boolean dr = f=='t' && t=='t'; //3
System.out.println( nu ? 0 : ei ? 1 : zw ? 2 : dr ? 3 : "invalid");

0
boolean b = a = true ? ++i > 2 ? true:false:false; 中发生了以下内容:
a = true

这将给出a true值并评估为true

然后我们得到另一个条件,++i > 2来自于++i > 2 ? true:false,在这种情况下也将为真。结果将是true


0

如果您能使用括号并按以下方式检查代码,将会很有帮助;

boolean b = a = (true ? (++i > 2 ? true : false) : false);

你可以把它想象成:

if (true) // # If Number:1
{
    if (++i > 2) // # If Number:2
    {
        a = true;            
    }
    else { a = false; }
}
else { a = false; }

if(true)是一个重言式时,If Number:2将总是被执行。因此,它变成了:

if (++i > 2)
{
    a = true;            
}
else { a = false; }

可以被评估为:a = (++i > 2) ? true : false);,并且变成了:a = ++i > 2,结果是b = a,即++i > 2

0

可怕的代码!

有一些线索表明,b = a = true ? ... 应该是 b = a == true ? ...,否则前一行是一个无用的赋值(a 没有被读取),并且该行的最终 false 将成为无法访问的代码。编译器会告诉你这个错误。

我将回答假设已经更正了 ==,但你会知道它是你自己的笔误、不可靠的来源还是“发现错误”测试,并能够在任何你喜欢的代码上使用相同的技术。

技巧是一步一步地重构它。首先根据优先规则添加括号和缩进。

 b = a == true ? ++i > 2 ? true:false:false;
 ... becomes ...
 b = (a == true) 
          ? (++i > 2 ? true:false)
          :false;

接下来请注意:

  • a == true 相当于 a
  • boolean x = a ? true : false; 相当于 boolean x = a

因此:

 b = a
     ? (++i > 2)
     :false;

或者:

 b = a && ( ++i > 2 );

如果这是“严肃”的代码,处理方式应该是编写一组单元测试,覆盖所有可能的输入情况。然后逐个进行这些重构,每次重新运行测试以确保您没有改变代码的行为。
请注意,在简化形式中没有truefalse文字。在三元操作中看到布尔文字 - 或者说,对于布尔值的三元表达式 - 是一种代码气味,因为非三元版本通常更简单、更清晰。
三元表达式非常有用,因为它们的预期目的是将布尔条件映射到非布尔输出:
 shippingPrice = orderTotal >= freeShippingThreshold ? 0 : getStandardShipping();

0

通过猜测正在尝试的内容并重命名变量,假设 a = true 应该是 a == true,你可以得到:

    boolean failed = result > 10 ? true: false;
    boolean b = failed ? ++retries > 2 ? true:false:false;

这样就可以整理成更加合乎逻辑的形式:

    boolean failed = result > 10;
    boolean giveUp = failed && ++retries > 2;

0

三元运算符是

条件为真则为true,否则为false

条件始终为真(因为a等于true)。

然后结果为true,因为++i大于2(它是3)。

因此,它将true分配给b。如果条件为false,则会分配false。那个false将从最后一个false分配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接