2014-03-03 121 views
4

我正在学习一些Java,现在我遇到了下面这段代码。我理解典型的三元运算符(例如下面以“boolean a”开头的行)的方式,但我无法理解如何读取以“boolean b”开头的行上的表达式。任何关于如何阅读这一行的帮助将非常感谢!谢谢!Java多个三元运算符

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。我感觉到你 - 那个代码是深奥的。 –

+0

三元运算符具有以下格式(条件为真时的条件?结果:条件为假时的结果)。因此,在这里,我们定义布尔a,然后为其分配三元运算符的结果。 –

回答

5

打破它是这样的:

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; 

这里,检查是否atrue。如果是,则执行我们已经检查过的检查(即,查看i的增量值是否大于2),否则返回false

但即使是这种复杂的表达式可以只是简单:

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

最后一个错误呢?它是否做了一个真值表T v F = T? – Brian

+0

在这种情况下,最后一个'false'永远不会被评估,因为测试总是'真'。 –

+0

啊,好吧,我现在看到。 – Brian

0

boolean b = a = true ? ++i > 2 ? true:false:false;会发生以下情况:

a = true 

这会给atrue值和评价true

比我们得到另一个条件++i > 2++i > 2 ? true:false,在这种情况下也是如此。结果将是true

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; 

ca Ñ也可写成:

boolean a = x > 10; 
+0

我不认为这是正确的。 'boolean b = a = true'是正确的;它只是将结果分配给'a'和'b'。 –

+0

a == true不是太好,但它不会赋予a真。 –

+0

仅供参考,IntelliJ将其简化为'boolean b = a = ++ i> 2;'。 –

0

三元运算是

条件然后真或假

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

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

因此,它将true赋予b。如果条件错误,它将分配错误。该错误将由最后的错误分配。

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)Tautology如果数: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 ? ...,否则前行是一个无用的分配(一个是从来不看),而行的最后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;