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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李国荧 中级黑马   /  2014-8-7 21:03  /  6488 人查看  /  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 个回复

正序浏览
学习了呀
回复 使用道具 举报
我自己来学习学习……
回复 使用道具 举报
我自己来学习学习……
回复 使用道具 举报
三目运算符……
回复 使用道具 举报
三目运算符……
回复 使用道具 举报
三目运算符……
回复 使用道具 举报
三目运算符……
回复 使用道具 举报
三目运算符……
回复 使用道具 举报
李国荧 发表于 2014-8-10 10:05
感谢您的回复,对于您的回复我还有如下疑问:
在三目运算符中,0 < 1 为true,所以应该返回c = c + 1表达 ...

我刚刚仔细看了一遍,你还是按照2L理解。我的代码分析有误。
回复 使用道具 举报
zeus00456 发表于 2014-8-9 14:01
java不同于C语言,java的三目运算符限制颇多
1.不支持逗号表达式
2.返回处不支持完整的语句(虽然支持表达 ...

感谢您的回复,对于您的回复我还有如下疑问:
在三目运算符中,0 < 1 为true,所以应该返回c = c + 1表达式的值,这是一个赋值表达式,赋值表达式是有返回值的,即右边表达式的值、也就是返回2,temp2也被初始化为了2。按照2楼的方式修改后的运行结果说明了这一点。
回复 使用道具 举报
三目运算符
回复 使用道具 举报
java不同于C语言,java的三目运算符限制颇多
1.不支持逗号表达式
2.返回处不支持完整的语句(虽然支持表达式)

下面这一句
int temp2 = 0 < 1 ? c = c + 1 : d = d + 1;
0确实小于1,执行 c = c+1;这条语句执行后,没有返回任何值,即temp没有被初始化
然后,你报的错应该是变量未被初始化吧。
回复 使用道具 举报
yqj 中级黑马 2014-8-9 12:08:04
14#
李国荧 发表于 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);
就 ...

学习了,谢谢..............
回复 使用道具 举报
我纳闷着 自己知道三元运算符  三目是什么。。。进来一看:L 一个东西
回复 使用道具 举报
梧桐树下 来自手机 中级黑马 2014-8-8 23:20:55
11#
学习了,,,,
回复 使用道具 举报
学习了呀
回复 使用道具 举报
二楼,真厉害啊!
回复 使用道具 举报
结贴,答案参见2楼(沙发)。
(弱弱的问一句,这样算是结贴了吗??)
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马