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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝勇 中级黑马   /  2013-4-1 12:06  /  2364 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郝勇 于 2013-4-1 14:12 编辑


为什么第一个打印结果是67  为什么没有强转   为什么第三个就可以强转    第一个只是将其放入了三元运算中而已

点评

建议贴代码 别截图  发表于 2013-4-1 13:43

12 个回复

倒序浏览
能把代码发过来吗  看到好别扭
回复 使用道具 举报
建议以后提问能附上代码而不是图片,方便别人为你调试代码。

三目条件运算符必须要返回一个数据,类型必须确定, 不能条件为真时返回char类型,条件为假时返回int类型。
所以它就会进行类型转换了.转换规则:以大为准。   如果将System.out.println(consnum>9?(char)(con-10+'A'):consnum)
改成System.out.println(consnum>9?(char)(con-10+'A'):67)则可以返回c。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
补充下:我自己敲的代码为简便将consnum改成了con    提交的时候有两个忘记改了。  应该能分辨。
回复 使用道具 举报
返回值会自动转换到最大,这里就是int类型。
回复 使用道具 举报
黑马伍哲沂 发表于 2013-4-1 12:55
建议以后提问能附上代码而不是图片,方便别人为你调试代码。

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

System.out.println(consnum>9?(char)(con-10+'A'):67)  你那个67的位置上是前面的一个参数 不能这么改 要是改成67  岂不是 只要不满足>9就都输出67?
回复 使用道具 举报
本帖最后由 黑马伍哲沂 于 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:35
嗯  这样的环境是不能这么改。我其实只是想用这个说明条件运算符的特点。  
如果真要改的话 可以改成
Syst ...

毕老师就是这么讲的啊!  难道我笔记记错了?
回复 使用道具 举报
三元运算符中不可以真假返回不同的类型,如果类型不同,会以最大的为主。在最后一个consnum前加上(char)应该就可以解决了。我以前就犯过这个错误,很是纠结。。。
回复 使用道具 举报
郝勇 发表于 2013-4-1 13:46
毕老师就是这么讲的啊!  难道我笔记记错了?

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

如果有出入的话  贴出来看看。
回复 使用道具 举报
郝勇 发表于 2013-4-1 13:46
毕老师就是这么讲的啊!  难道我笔记记错了?

毕老师好像是这么讲的,但是这里出现了点小漏洞。。。。你先把三元运算符的特点搞清楚
回复 使用道具 举报
这是我查的一些资料,很详细,懂了!
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。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马