黑马程序员技术交流社区

标题: 三元运算 [打印本页]

作者: 西门吹风    时间: 2014-5-26 14:37
标题: 三元运算
  1. int x=8,y;
  2. y=(x>5)?100:200;
复制代码
这样写可以正常运行
  1. int x=8,y;
  2. (x>5)?y=100:y=200;
复制代码
不知道为什么这样写编译时就报错
x>5 为真,不是应该去执行y=100吗?



作者: 波涛    时间: 2014-5-26 14:45
本帖最后由 波涛 于 2014-5-26 14:47 编辑

首先三目运算符 (表达式1)?(表达式2) : (表达式3),计算方法是这样的:表达式1是一个逻辑表达式,如果其值为true,则整个表达式的值为表达式2的值,否则为表达式3的值,最终返回的就是个值,不是表达式y=100什么的。终归运算符诸如加减乘除,其最终计算出来的就是一个值。不能当流程控制语句。
作者: 张辉玉    时间: 2014-5-26 15:09
楼主, 就像你上面写的 y=(x>5)?100:200;  首先是判断x>5?为真就执行100,获取的个返回值给y,为假就获取返回值200给y. 三元运算符是必须要有返回值的赋值给XX对象的。你后面那样写返回去的只是一个表达式而已。
作者: 西门吹风    时间: 2014-5-26 15:22
本帖最后由 西门吹风 于 2014-5-26 15:43 编辑

看了楼上两位的解释,好像有点明白了,是不是可以这样理解,(表达式1)?(表达式2) : (表达式3)中的(表达式2)和(表达式3)必须是有结果的表达式,并根据(表达式1)的真假返回对应的值?
作者: 向前看向前走    时间: 2014-5-26 15:45
(x>5)?y=100:y=200;
放在了Eclispe中试验了一下,看到了提示的错误


可以看到第一个错误是提示左边必须有一个变量,



我们加上这个变量之后可以看到提示的是Syntax error on token "=", != expected 语法错误
说明三元应该是一个整体吧,左边必须有接收值的变量,同时还要有返回值,而赋值没有返回值!


作者: 李小石    时间: 2014-5-26 18:20
三元运算符在运算过程是有优先级的,你代码中 “y="是最后运算后的赋值过程
  1. //这个是给的可以编译的
  2. int x = 8,y;
  3. y = (x>5)?100:200

  4. //这个加了两个变量m.n
  5. int x = 8,y,m,n;
  6. y = (x>5)?m=100:n=200

  7. /*
  8. 程序会出现编译错误
  9. 原因是返回值是y = (m=100),而y是int型
  10. */
复制代码


就是说三元运算符一定要返回一个确定的值,且这个值是要和表倒式2-3同类型的值
作者: 13556793092    时间: 2014-5-26 19:01
很简单帮你说明这个道理 与运算顺序什么的无关
//首先来说下第一个
int x=8,y;
y=(x>5)?100:200;
这里肯定先运行的代码是  y=(x>5)吗,毫无疑问,
这点代码y参与运算,而你确没有初始化变量y的值,肯定会报错。
这时候只需要在初始化y=0就好

int x=8,y;
(x>5)?y=100:y=200;
第二份代码  (x>5),先进行比较运算,然后给y赋值。

要点:变量初始化的时候需要赋值才能参与运算。

版主  不要吝啬你的分啊   就差技术分了

作者: wyy666    时间: 2014-5-26 21:38
不符合三元格式啊
作者: 幽灵_Sc    时间: 2014-5-26 22:21
后面两个表达式要求返回值,赋值语句不能返回值的!
作者: 27ZJQ    时间: 2014-5-30 17:10
第一种表达式是固定的吧?
作者: 泛小型    时间: 2014-6-13 19:30
一起分析分析
作者: 、海    时间: 2014-6-13 19:56
y如果是在类的成员位置上时可以不用赋值;若是在方法中,则必须赋值。
作者: qincai    时间: 2014-6-13 20:03
本帖最后由 qincai 于 2014-6-13 23:50 编辑

只要是运算符都会有一个结果,三元运算符是一个整体
作者: GYSWL    时间: 2014-8-8 07:47
你没看毕老师的视频吧,毕老师说,三元运算和if的区别,三无运算是一种赋值运算,一定要有返回值的,前面当然要有=啦,而if就不用啦,不信你试试
作者: 风声相伴    时间: 2014-9-15 14:05
向前看向前走 发表于 2014-5-26 15:45
(x>5)?y=100:y=200;
放在了Eclispe中试验了一下,看到了提示的错误

不错,很给力啊
作者: Chills719    时间: 2014-10-15 19:19
不错,支持一个!!!!
作者: 王者之风西昆仑    时间: 2014-12-30 12:50
向前看向前走 发表于 2014-5-26 15:45
(x>5)?y=100:y=200;
放在了Eclispe中试验了一下,看到了提示的错误

解释的很到位
作者: pj1988    时间: 2015-1-15 11:14
确实,第一个y没有初始化,当然报错

作者: DxxD    时间: 2015-3-9 10:09
这也行。。。还真能整啊
作者: heima_yjh    时间: 2015-3-12 16:26
波涛 发表于 2014-5-26 14:45
首先三目运算符 (表达式1)?(表达式2) : (表达式3),计算方法是这样的:表达式1是一个逻辑表达式,如果其值 ...

讲解的很到位
作者: jipeng    时间: 2015-4-11 22:03
呵呵  三元运算返回的是结果,不是赋值哦
作者: WangHe9527    时间: 2015-4-14 22:18
三元运算符是一个运算符 运算完必须要有一个结果,你这么写有结果吗  结果是什么?思考一下
作者: 安日成    时间: 2015-4-29 00:30
没有返回值就这么简单
作者: 严晗哲    时间: 2015-5-14 23:11
在三元运算符中,他结果是把分号两边的值赋给某个变量。当为真时,把左边的赋值,为假时,把右边的值赋值给变量。所以:(条件表达式)?值1:值2,分号两边必须是具体的值,而不是y=100(赋值语句)
作者: wx_iAuO26mH    时间: 2015-6-5 10:59
恩恩 很好
作者: 小方的sunshine    时间: 2015-7-5 16:55
三元运算符,我喜欢用于集合比较器排序的比较是否相同
  
作者: 岁月草-    时间: 2015-8-15 14:30
看完瞬间懂了那么多~{:2_32:}
作者: Z攻城狮    时间: 2015-8-16 06:40
自己还是需要好好学习啊
作者: leiothrixs    时间: 2016-3-17 19:03
把里面的空格加上,看得就一目了然了 , y = (x>5) ? 100 :200;  可以理解为 y = (关系表达式) ? 表达式1 : 表达式2; 一一对应这里关系表达式为x>5; 为true,  所以执行表达式1,即y = 100.
作者: fanhongwei1105    时间: 2016-5-26 22:00
三元运算和if的区别,三无运算是一种赋值运算,一定要有返回值的,前面当然要有=啦,而if就不用啦




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