黑马程序员技术交流社区

标题: 有关Java三目运算符的疑问 [打印本页]

作者: 李国荧    时间: 2014-8-7 21:03
标题: 有关Java三目运算符的疑问
本帖最后由 李国荧 于 2014-8-8 13:17 编辑

代码如下:
  1. public class ThreeOperators{
  2.     public static void main(String[] args){
  3.         int a = 1, b = 10;
  4.         int temp1 = 0 < 1 ? a++ : b++;
  5.         System.out.println("a = " + a + ", b = " + b);//a = 2, b = 10
  6.         System.out.println("temp1 = " + temp1);//temp1 = 1
  7.                
  8.         int c = 1, d = 10;
  9.         //下面一行代码有问题
  10.         //int temp2 = 0 < 1 ? c = c + 1 : d = d + 1;
  11.         //下面一行代码正确
  12.         int temp2 = 0 < 1 ? c = c + 1 : d + 1;
  13.         System.out.println("c = " + c + ", d = " + d);//c = 2, d = 10
  14.         System.out.println("temp2 = " + temp2);//temp2 = 2
  15.     }
  16. }
复制代码

问题代码会(即第10行被注释掉的代码)出现如下编译错误:

ThreeOperators.java:10: error: unexpected type
                int temp2 = 0 < 1 ? c = c + 1 : d = d + 1;
                                  ^
  required: variable
  found:    value
1 error

expression1 ? expression2 : expression3
三目运算符是有返回值的,如果expression1的值为true,则返回expression2表达式的值,否则返回expression3表达式的值。
赋值运算符(=)也是有返回值的,赋值表达式的值为赋值运算符(=)右边的表达式的值。
比如:c = c + 1;表达式的值是c+1的值。
1、既然赋值运算符(=)也是有返回值的,那为什么赋值表达式不能出现在expression3的位置呢??

2、为什么赋值表达式可以出现在expression2的位置,却不能出现在expression3的位置呢??


结贴,答案参见2楼。
感谢2楼的解答。

作者: yqj    时间: 2014-8-7 23:20
本帖最后由 yqj 于 2014-8-7 23:22 编辑

改为int temp2 = 0 < 1 ? (c = c + 1) : (d = d + 1);或int temp2 = 0 < 1 ? c = c + 1 : (d = d + 1);
就不会报错,java虚拟机在编译三目运算时是以 "?" 和 ":" 来判断各位置的代码充当的结构, “?”前作为一部分,“?”和“:”中间作为一部分,“:”后作为一部分

int temp2 = 0 < 1 ? c = c + 1 : d = d + 1;报错的原因是 jvm把这个式子看作了
int temp2 =(  0 < 1 ? ( c = c + 1) : d)    = d + 1;的形式并没用把后面的式子d =d+1看做一个整体
而  0 < 1  ? ( c = c + 1) : d 是一个式子不能被d+1赋值!


作者: 咸菜+萝卜干    时间: 2014-8-8 00:11
抢地主{:3_47:}
作者: kangkai    时间: 2014-8-8 08:55
学习了~~~~~~~~~~~
作者: 李利威    时间: 2014-8-8 10:28
涨见识了!!顶啊
作者: Justfeeling    时间: 2014-8-8 10:33
学习了。
作者: 李国荧    时间: 2014-8-8 13:07
yqj 发表于 2014-8-7 23:20
改为int temp2 = 0 < 1 ? (c = c + 1) : (d = d + 1);或int temp2 = 0 < 1 ? c = c + 1 : (d = d + 1);
就 ...

感谢您的回复,非常详细的解释,谢谢。
作者: 李国荧    时间: 2014-8-8 13:13
结贴,答案参见2楼(沙发)。
(弱弱的问一句,这样算是结贴了吗??)
作者: 天邃任我桓    时间: 2014-8-8 15:54
二楼,真厉害啊!
作者: 13155155528    时间: 2014-8-8 21:46
学习了呀
作者: 梧桐树下    时间: 2014-8-8 23:20
学习了,,,,
作者: 莫忘本心    时间: 2014-8-8 23:37
我纳闷着 自己知道三元运算符  三目是什么。。。进来一看:L 一个东西
作者: 阿温    时间: 2014-8-9 00:41
yqj 发表于 2014-8-7 23:20
改为int temp2 = 0 < 1 ? (c = c + 1) : (d = d + 1);或int temp2 = 0 < 1 ? c = c + 1 : (d = d + 1);
就 ...

学习了,谢谢..............
作者: yqj    时间: 2014-8-9 12:08
李国荧 发表于 2014-8-8 13:07
感谢您的回复,非常详细的解释,谢谢。

客气了,前段时间刚看了传智的一个视频,讲到了这个问题,所以我就知道
作者: zeus00456    时间: 2014-8-9 14:01
java不同于C语言,java的三目运算符限制颇多
1.不支持逗号表达式
2.返回处不支持完整的语句(虽然支持表达式)

下面这一句
int temp2 = 0 < 1 ? c = c + 1 : d = d + 1;
0确实小于1,执行 c = c+1;这条语句执行后,没有返回任何值,即temp没有被初始化
然后,你报的错应该是变量未被初始化吧。
作者: 申航航    时间: 2014-8-9 14:19
三目运算符

作者: 李国荧    时间: 2014-8-10 10:05
zeus00456 发表于 2014-8-9 14:01
java不同于C语言,java的三目运算符限制颇多
1.不支持逗号表达式
2.返回处不支持完整的语句(虽然支持表达 ...

感谢您的回复,对于您的回复我还有如下疑问:
在三目运算符中,0 < 1 为true,所以应该返回c = c + 1表达式的值,这是一个赋值表达式,赋值表达式是有返回值的,即右边表达式的值、也就是返回2,temp2也被初始化为了2。按照2楼的方式修改后的运行结果说明了这一点。
作者: zeus00456    时间: 2014-8-10 11:09
李国荧 发表于 2014-8-10 10:05
感谢您的回复,对于您的回复我还有如下疑问:
在三目运算符中,0 < 1 为true,所以应该返回c = c + 1表达 ...

我刚刚仔细看了一遍,你还是按照2L理解。我的代码分析有误。
作者: 李国荧    时间: 2014-8-30 20:52
三目运算符……
作者: 李国荧    时间: 2014-8-30 20:53
三目运算符……
作者: 李国荧    时间: 2014-8-30 20:57
三目运算符……
作者: 李国荧    时间: 2014-8-30 20:58
三目运算符……
作者: 李国荧    时间: 2014-8-30 21:00
三目运算符……
作者: 李国荧    时间: 2014-8-31 19:44
我自己来学习学习……
作者: 李国荧    时间: 2014-8-31 19:57
我自己来学习学习……
作者: msn泡沫    时间: 2017-4-28 08:50
学习了呀




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2