黑马程序员技术交流社区

标题: 99乘法表的循环问题出错,请指点 [打印本页]

作者: 孙汇川    时间: 2012-2-5 11:15
标题: 99乘法表的循环问题出错,请指点
class  No1
{
        public static void main(String[] args)
        {
                for(int x=1;x<=9;x++)
                {
                        for(int y=1;y<=x;y++)
                        {
                        System.out.print(x+'*'+y+'='+(x*y)+"\t");
                        }
                        System.out.println();
                }
        }
}


但是输出语句中*的''改成""就出现正确答案,为什么呢????????
作者: 马欢    时间: 2012-2-5 11:37
本帖最后由 马欢 于 2012-2-5 11:38 编辑

最好"*"和"="都加"    ",因为如果是'   ',则是char类型,是单个字符,在ASC码表中都会有对应的数值,而你是想直接输出这两个字符,所以最好用"  ",因为字符串不会和运算符产生运算,而有数字对应值的单个字符会被运算符运算,那么就成了运算和不是输出。如果你单个输出不会有问题,但是一起输出就会用到"+"号。会产生数学运算。
作者: 王文龙    时间: 2012-2-5 11:56
' '用单引号修饰的是char类型,
char类型与int类型相加会向上提升类型,
相加成int类型,
就会得不到想要的结果了.

这就与1+"2",与字符串相加得字符串是如出一辙的.
作者: 梅雄新    时间: 2012-2-5 12:30
楼主出现的问题是基本类型数据运算的问题
在基本类型中单引号''赋值的是字符型的变量
双引号""是字符串类型
基本类型数据运算中,不同类型的数据运算都要向上转型
楼主用int类型与char类型运算,char类型会自动转换成int类型,再做运算,
所以楼主的输出(x+'*'+y+'='+(x*y))结果为整型,而非期望的字符串,只是在最后与"\t"运算时才转为字符串,输出结果

作者: 王_涛    时间: 2012-2-5 13:51
错误发生在:System.out.print(x+'*'+y+'='+(x*y)+"\t");

'*'代表的是字符* 在进行+操作时转换成ascii码为42
'='的ascii码是61

这句话的意思是:当循环执行到第一句时,即x=1,y=1;
x+'*'+y+'='+(x*y)为:1+42+1+61+(1*1) 值为106
以此类推...


当吧''改成""时,"*"代表的是字符串,在进行+操作时,执行字符串的连接操作,不执行加法运算。
作者: 衣服    时间: 2012-2-5 14:30
错误原因:如上面的两位说的那样char会被转为int来运算。举个例子 第一次循环的话 输出语句里面的计算表达式为:1+'*'+1+'='+(x*y)    * 的十进制ASCII码为42 ,=的ASSCII 十进制码为 61   ,最后运算的表达式就是1+42+1+61+1   和你程序输出的结果是一样。下面我们看下是否是这样的
public class  No1
{
        public static void main(String[] args)
        {
               
                int a='*';
                int b='=';
                   System.out.println("a="+a);
                   System.out.println("b="+b);
                for(int x=1;x<=9;x++)
                {
                        for(int y=1;y<=x;y++)
                        {
                        System.out.print(x+'*'+y+'='+(x*y)+"\t");
                        System.out.print((x+a+y+b+(x*y))+"\t");
                         }
                        System.out.println();
                }
              
            
        }
        
         
}



作者: 魏腾飞    时间: 2012-2-5 16:06
哈哈,我验证了一把。你的程序挺好的,就是有"*"、'*'和"="、'='的不一样。我把'*'和'='都定义成字符类型然后强制转化成int型输出发现你的程序就是这样将它们都转化成了int行相加了。
class  No1
{
        public static void main(String[] args)
        {
                for(int x=1;x<=9;x++)
                {
                        for(int y=1;y<=x;y++)
                        {
                        System.out.print(x+'*'+y+'='+(x*y)+"\t");
                        }
                        System.out.println();
                }
                char b='*';
                System.out.println((int)b);//b=42
                char c='=';
                System.out.println((int)c);//c=61
        }   
}
你看一下吧。
作者: 彭沛东    时间: 2012-2-5 16:11

  System.out.print(x+'*'+y+'='+(x*y)+"\t"); 、打印语句中的'是单个字符、在asc码有对应的数值,所以导致打印的结果不对。所以最好是用""代替掉'。
作者: 何洪森    时间: 2012-2-5 16:44
导致输出不是理想结果的语句是:System.out.print(x+'*'+y+'='+(x*y)+"\t");其中'*'和'='与"*"和"="不同,前者是表示char类型,而后者则表示字符串类型。字符'*'对应asc码相应的数值。所以导致了错误。所以只需修改成:System.out.print(x+"*"+y+"="+(x*y)+"\t");即可。

作者: 张青峰    时间: 2012-2-5 17:03
System.out.print(x+'*'+y+'='+(x*y)+"\t"); '*'表示一个字符,楼主实际上想打打印一个*号出来.楼主这样写了后整条语句的意思就变了,变成了:
* 的十进制ASCII码为42 ,=的ASSCII 十进制码为 61   ,最后运算的表达式就是1+42+1+61+1  
楼主可以在后面加一条语句:
System.out.println((x+"*"+y+"="+(x*y)+"\t")
这样你就可以对照两种输出结果的异同了.
作者: 许涛    时间: 2012-2-6 02:48

代码中的'*'符号修饰,意味着是char类型,char类型的字符在ASCII码表里有对应的数字,
因而System.out.print(x+'*'+y+'='+(x*y)+"\t");这句代码中x+'*'的加号已经不是连接符的含义,
而是加法符,实际上是int型数据和char型数据在做数据运算;后面的'='也是如此

毕老师讲变量的时候有提到类型转换的问题,楼主还有疑问的话,可以回头看下毕老师的视频:黑马程序员_毕向东_Java基础视频教程第02天-08-类型转换.avi   : )




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