A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李国荧 中级黑马   /  2014-8-7 21:03  /  6495 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李国荧 于 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楼的解答。

25 个回复

倒序浏览
本帖最后由 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赋值!

回复 使用道具 举报 2 0
抢地主{:3_47:}
回复 使用道具 举报
学习了~~~~~~~~~~~
回复 使用道具 举报
涨见识了!!顶啊
回复 使用道具 举报
学习了。
回复 使用道具 举报
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);
就 ...

感谢您的回复,非常详细的解释,谢谢。
回复 使用道具 举报
结贴,答案参见2楼(沙发)。
(弱弱的问一句,这样算是结贴了吗??)
回复 使用道具 举报
二楼,真厉害啊!
回复 使用道具 举报
学习了呀
回复 使用道具 举报
梧桐树下 来自手机 中级黑马 2014-8-8 23:20:55
11#
学习了,,,,
回复 使用道具 举报
我纳闷着 自己知道三元运算符  三目是什么。。。进来一看:L 一个东西
回复 使用道具 举报
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:04
14#
李国荧 发表于 2014-8-8 13:07
感谢您的回复,非常详细的解释,谢谢。

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

下面这一句
int temp2 = 0 < 1 ? c = c + 1 : d = d + 1;
0确实小于1,执行 c = c+1;这条语句执行后,没有返回任何值,即temp没有被初始化
然后,你报的错应该是变量未被初始化吧。
回复 使用道具 举报
三目运算符
回复 使用道具 举报
zeus00456 发表于 2014-8-9 14:01
java不同于C语言,java的三目运算符限制颇多
1.不支持逗号表达式
2.返回处不支持完整的语句(虽然支持表达 ...

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

我刚刚仔细看了一遍,你还是按照2L理解。我的代码分析有误。
回复 使用道具 举报
三目运算符……
回复 使用道具 举报
三目运算符……
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马