黑马程序员技术交流社区

标题: 三元运算中类型转换 [打印本页]

作者: 郝勇    时间: 2013-4-1 12:06
标题: 三元运算中类型转换
本帖最后由 郝勇 于 2013-4-1 14:12 编辑


为什么第一个打印结果是67  为什么没有强转   为什么第三个就可以强转    第一个只是将其放入了三元运算中而已
作者: 邵震    时间: 2013-4-1 12:12
能把代码发过来吗  看到好别扭
作者: 黑马伍哲沂    时间: 2013-4-1 12:55
建议以后提问能附上代码而不是图片,方便别人为你调试代码。

三目条件运算符必须要返回一个数据,类型必须确定, 不能条件为真时返回char类型,条件为假时返回int类型。
所以它就会进行类型转换了.转换规则:以大为准。   如果将System.out.println(consnum>9?(char)(con-10+'A'):consnum)
改成System.out.println(consnum>9?(char)(con-10+'A'):67)则可以返回c。
作者: 黑马伍哲沂    时间: 2013-4-1 12:56
补充下:我自己敲的代码为简便将consnum改成了con    提交的时候有两个忘记改了。  应该能分辨。
作者: 柳 德 彬    时间: 2013-4-1 13:03
返回值会自动转换到最大,这里就是int类型。
作者: 郝勇    时间: 2013-4-1 13:28
黑马伍哲沂 发表于 2013-4-1 12:55
建议以后提问能附上代码而不是图片,方便别人为你调试代码。

三目条件运算符必须要返回一个数据,类型必须 ...

System.out.println(consnum>9?(char)(con-10+'A'):67)  你那个67的位置上是前面的一个参数 不能这么改 要是改成67  岂不是 只要不满足>9就都输出67?
作者: 黑马伍哲沂    时间: 2013-4-1 13:35
本帖最后由 黑马伍哲沂 于 2013-4-1 13:37 编辑
郝勇 发表于 2013-4-1 13:28
System.out.println(consnum>9?(char)(con-10+'A'):67)  你那个67的位置上是前面的一个参数 不能这么改  ...

嗯  这样的环境是不能这么改。我其实只是想用这个说明条件运算符的特点。  
如果真要改的话 可以改成
System.out.println(consnum>9?(char)(consnum-10+'A') : (char)consnum);
总之  这里要强转就必须保证两个表达式是是同一个类型返回,或者其中一个是常量,另外一个表达式可以用这个常量来表示
比如 一个是10  另外一个是‘A’。   
作者: 郝勇    时间: 2013-4-1 13:46
黑马伍哲沂 发表于 2013-4-1 13:35
嗯  这样的环境是不能这么改。我其实只是想用这个说明条件运算符的特点。  
如果真要改的话 可以改成
Syst ...

毕老师就是这么讲的啊!  难道我笔记记错了?
作者: 赵海洋    时间: 2013-4-1 13:49
三元运算符中不可以真假返回不同的类型,如果类型不同,会以最大的为主。在最后一个consnum前加上(char)应该就可以解决了。我以前就犯过这个错误,很是纠结。。。
作者: 黑马伍哲沂    时间: 2013-4-1 13:50
郝勇 发表于 2013-4-1 13:46
毕老师就是这么讲的啊!  难道我笔记记错了?

额  这是自己实验  和 查相关资料得出来的结论  。  毕老师怎么讲的我没看额。。。。因为我之前自学过c一部分内容  所以毕老师前面的视频我跳过了  决定以后申请黑马班的时候 从头至尾再看一遍。
作者: 黑马伍哲沂    时间: 2013-4-1 13:51
郝勇 发表于 2013-4-1 13:46
毕老师就是这么讲的啊!  难道我笔记记错了?

如果有出入的话  贴出来看看。
作者: 打工人    时间: 2013-4-1 13:54
郝勇 发表于 2013-4-1 13:46
毕老师就是这么讲的啊!  难道我笔记记错了?

毕老师好像是这么讲的,但是这里出现了点小漏洞。。。。你先把三元运算符的特点搞清楚
作者: 郝勇    时间: 2013-4-1 14:11
这是我查的一些资料,很详细,懂了!
public class Apple{
public static void main(String[] args)
{
   char x='Y';
   int i=1;
   System.out.println(true? x:i);
   System.out.println(false ? 1:x);
}

} 这个输出为什么是89和Y,不是Y和Y呢?

答案是:(比较长,耐心看)

(1)如果表达式1和表达式2具有相同的类型,那么整个条件运算符结果的类型就是这个类型。

(2)如果一个表达式的类型是T,T是byte或short或char,另一个表达式的类型是int类型的常量表达式,而且这个常量表达式的值是可以用类型T表示的(也就是说,常量表达式的值是在类型T的取值范围之内),那么整个条件运算符结果的类型就是T。


(3)除以上情况外,如果表达式1和表达式2的类型不同,那么将进行类型提升,整个条件运算符结果的类型就是提升后的类型。


System.out.println(true?x:0); / ne3。表达式1是char类型,表达式2是int类型的常量表达式,而且这个常量表达式的值0可以用char类型来表示,因此整个条件运算符结果的类型就应当是char类型,所以输出的结果就是'A'。
System.out.println(true?x:1111111110); / ne4。表达式1是char类型,表达式2是int类型的常量表达式,但是这个常量表达式的值已经超出了char类型的取值范围,因此要进行类型提升,把char类型提升为int类型,整个条件运算符结果的类型就是int类型了,所以输出的结果是65(字符A的ASCII码)。



System.out.println(false?i:x); / ne5。表达式1是int类型的变量,表达式2是char类型的变量,没有常量表达式。因此要进行类型提升,把char类型提升为int类型,整个条件运算符结果的类型就是int类型。所以输出结果就是65。





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