System.out.println(true?false:true == true?false:true);输出问题

lonefeifei 2010-06-22 11:08:48
System.out.println(true?false:true == true?false:true);

输出是什么呢??并给出解释
...全文
683 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 healer_kx 的回复:]
无聊。。。
[/Quote]

绝对无聊,谁要是把代码写成这样,肯定要被打 PP 了!
shine333 2010-06-22
  • 打赏
  • 举报
回复

动手试了一下,我错了
zwb_1988 2010-06-22
  • 打赏
  • 举报
回复
刚刚没放上表格。

Java操纵符,优先级表(英文):
http://www.java-tips.org/java-se-tips/java.lang/what-is-java-operator-precedence.html
shine333 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 izard999 的回复:]
true?false:true这个为false
再判断false == true?false:true
当然输出false了
[/Quote]
你的顺序错了,三元优先度高于比较
zwb_1988 2010-06-22
  • 打赏
  • 举报
回复
这是跟操纵符的优先级有关的。 看下表:


<table border="1">
<tr>

<th>Priority</th>
<th>Operator</th>
<th>Operation</th>
<th>Order of Evaluation</th>
</tr>

<tr>

<td rowspan="3">1</td>
<td><code>[ ]</code></td>
<td>Array index</td>
<td rowspan="3">Left to Right</td>
</tr>
<tr>
<td><code>()</code></td>

<td>Method call</td>
</tr>
<tr>
<td><code>.</code></td>
<td>Member access</td>
<tr>
<td rowspan="7">2</td>

<td><code>++</code></td>
<td>Prefix or postfix increment</td>
<td rowspan="7">Right to Left</td>
</tr>
<tr>
<td><code>--</code></td>
<td>Prefix or postfix decrement</td>

</tr>
<tr>
<td><code>+ -</code></td>
<td>Unary plus, minus</td>
</tr>
<tr>
<td><code>~</code></td>

<td>Bitwise NOT</td>
</tr>
<tr>
<td><code>!</code></td>
<td>Boolean (logical) NOT</td>
</tr>
<tr>

<td><code>(type)</code></td>
<td>Type cast</td>
</tr>
<tr>
<td><code>new</code></td>
<td>Object creation</td>
<tr>

<td rowspan="1">3</td>
<td><code>* / %</code></td>
<td>Multiplication, division, remainder</td>
<td rowspan="1">Left to Right</td>
<tr>
<td rowspan="2">4</td>

<td><code>+ -</code></td>
<td>Addition, subtraction</td>
<td rowspan="2">Left to Right</td>
</tr>
<tr>
<td><code>+</code></td>
<td>String concatenation</td>

<tr>
<td rowspan="3">5</td>
<td><code><<</code></td>
<td>Signed bit shift left to right</td>
<td rowspan="3">Left to Right</td>
</tr>
<tr>

<td><code>>></code></td>
<td>Signed bit shift right to left</td>
</tr>
<tr>
<td><code>>>></code></td>
<td>Unsigned bit shift right to left</td>
<tr>
<td rowspan="3">6</td>

<td><code>< <=</code></td>
<td>Less than, less than or equal to</td>
<td rowspan="3">Left to Right</td>
</tr>
<tr>
<td><code>> >=</code></td>

<td>Greater than, greater than or equal to</td>
</tr>
<tr>
<td><code>instanceof</code></td>
<td>Reference test</td>
<tr>
<td rowspan="2">7</td>

<td><code>==</code></td>
<td>Equal to</td>
<td rowspan="2">Left to Right</td>
</tr>
<tr>
<td><code>!=</code></td>
<td>Not equal to</td>

<tr>
<td rowspan="2">8</td>
<td><code>&</code></td>
<td>Bitwise AND</td>
<td rowspan="2">Left to Right</td>
</tr>
<tr>

<td><code>& </code></td>
<td>Boolean (logical) AND</td>
<tr>
<td rowspan="2">9</td>
<td><code>^</code></td>
<td>Bitwise XOR</td>

<td rowspan="2">Left to Right</td>
</tr>
<tr>
<td><code>^ </code></td>
<td>Boolean (logical) XOR</td>
<tr>
<td rowspan="2">10</td>

<td><code>|</code></td>
<td>Bitwise OR</td>
<td rowspan="2">Left to Right</td>
</tr>
<tr>
<td><code>| </code></td>
<td>Boolean (logical) OR</td>

<tr>
<td rowspan="1">11</td>
<td><code>&&</code></td>
<td>Boolean (logical) AND</td>
<td rowspan="1">Left to Right</td>
<tr>
<td rowspan="1">12</td>

<td><code>||</code></td>
<td>Boolean (logical) OR</td>
<td rowspan="1">Left to Right</td>
<tr>
<td rowspan="1">13</td>
<td><code>? :</code></td>

<td>Conditional</td>
<td rowspan="1">Right to Left</td>
<tr>
<td rowspan="2">14</td>
<td><code>=</code></td>
<td>Assignment</td>

<td rowspan="2">Right to Left</td>
</tr>
<tr>
<td><code>*= /= += -= %= <br />
<<= >>= >>>= <br />
&= ^= |=</code></td>

<td>Combinated assignment <br />
(operation and assignment)</td>
</table>


从这张表我们可以看出, ==的优先级比条件操纵符高,所以
true?false:(true == true?false:true)

(true == true?false:true) 的结果是 false
因为 true?false:true 得出的结果是false, 然后true == false 就是 false了

那么,现在的结果就是: true?false:false

因为这个句子的条件永远都是true (不是true的话也得出相同的答案)。

我们可以通过下面的一个句子来证实:
false?false:true == true?false:true
它的结果和我们的假设是一样的。


现在我们来看看下面,我改过后的句型:
(true?false:true) == (true?false:true)
结果是: true

因为我们加了括号,而括号的优先级是很高的(如表所示),所以
两边的true?false:true会先被计算出来,也就是:
false == false
那么,结果就很明显了,是ture.
healer_kx 2010-06-22
  • 打赏
  • 举报
回复
无聊。。。
  • 打赏
  • 举报
回复
一个顺序,一个是三目运算符顺序。。

---

问题的确无聊!呵呵
dr_lou 2010-06-22
  • 打赏
  • 举报
回复
System.out.println(true?false:(true == true?false:true));
shine333 2010-06-22
  • 打赏
  • 举报
回复
System.out.println(true?false:true == true?false:true);

没什么可以解释的。只要了解三元运算符就可以知道,这段代码要么编译不通过,否则,只可能进第一个问号后面,判断为真的部分,冒号后面,直接无视

等价于
X=true
Y=false
Z=true == true?false:true
System.out.println(X?Y:Z);
Headsen 2010-06-22
  • 打赏
  • 举报
回复
int i=0;
System.out.println(ttrue?"11":true == true?i++:i--) //11

System.out.println(i) //0 i++ i--未执行。

问题的确无聊!呵呵
izard999 2010-06-22
  • 打赏
  • 举报
回复
true?false:true这个为false
再判断false == true?false:true
当然输出false了
Headsen 2010-06-22
  • 打赏
  • 举报
回复
输出false啊。
条件表达式 [A]?b:c
若A成立true,则返回b,否则返回c
true?false:true == true?false:true
先判断第一个true结果true,返回第一个false,后面的不执行。
izard999 2010-06-22
  • 打赏
  • 举报
回复
这个有点无聊了.!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧