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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵崇友 中级黑马   /  2013-3-29 16:28  /  2597 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵崇友 于 2013-3-30 16:58 编辑

如下图  

问题是:编译提示将num<<3;/后的注释信息“/左移3位相当于乘以8”也给报错了!为什么?

public class Test4
{
public static void main(String[] args)
{
int num=2;
num<<3;//左移3位相当于乘以8
System.out.println("2*8="+num);//输出语句
}
}
编译提示:Test4.java:7: 不是语句
                 num<<3;//左移3位相当于乘以8
                    ^
1 错误
改后:public class Test4
{
public static void main(String[] args)
{
int num=2;
num=num<<3;//左移3位相当于乘以8
System.out.println("2*8="+num);//输出语句
}
}
编译通过了!!!
求解释。
另外,发现,没改之前编译的时候,编译提示将num<<3;/后的注释信息“/左移3位相当于乘以8”也给报错了。又是为什么啊?
而我 将注释信息放到num<<3;的下一行时
num<<3;
//左移3位相当于乘以8
编译提示:
Test4.java:7: 不是语句
                 num<<3;
                    ^
1 错误
注释信息“//左移3位相当于乘以8”又没有了!!!

图片2.png (93.75 KB, 下载次数: 52)

图片2.png

点评

如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢  发表于 2013-3-30 08:00

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

19 个回复

倒序浏览
num<<3;//左移3位相当于乘以8  这句肯定错,没啥好解释的吧     我这只报一个错误 后面的没有啊

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
丁一 发表于 2013-3-29 16:44
num

俺是菜鸟,不懂,还是解释解释吧!!另外,我这运行 后面确实有啊
回复 使用道具 举报
赵崇友 发表于 2013-3-29 16:52
俺是菜鸟,不懂,还是解释解释吧!!另外,我这运行 后面确实有啊

童鞋 俺也是刚开始学Java  , num<<3;  只知道这个是语法错误, 其他的我也不知道怎么解释了:lol
回复 使用道具 举报
num = num<<3;
式子要有等号啊,要不怎么能是语句呢

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
"//"是用来注释的,编译器在碰到这个符号,就忽略后面的内容,因为不是Java语句,所以这里不会报错,
报错的仍然是num<<3;这句,你看错误提示就知道了啊,num<<3仅仅是一个表达式而已,运算结果必须用一个变量保存起来才行,
例如,num=num<<3;就行了。这就相当于你在语句里写一句“int a=0;a+1;”效果一样,照样报同样的错误!a+1这句没保存结果啊

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
fighting 发表于 2013-3-29 16:59
num = num

哦哦,明白了!!还有那编译提示  把注释信息也显示了,怎么讲啊?
回复 使用道具 举报
HM李超 发表于 2013-3-29 17:02
"//"是用来注释的,编译器在碰到这个符号,就忽略后面的内容,因为不是Java语句,所以这里不会报错,
报错 ...

嗯嗯,明白了!!谢谢,还想问问 我那编译确实还有那注释的信息,什么情况啊?
回复 使用道具 举报
开两个窗口看你的题目.伤不起啊!
num<<3;//这句话 明显有错误,要有=号的。
左移三位不一定就是num*8,你把num搞大一点,或者换成byte类型。就会知道了?
位移的速度比乘八的速度快,这个可以节省点时间,ACM比赛这种用法比较常见。
“<<"这个是无符号位移,"<<<"这个是有符号位移,建议你看java疯狂讲义(第二版)第三章第七节
希望对你有帮助,可以私密我

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 殇_心。 于 2013-3-29 17:52 编辑

因为  num<<3  这是一个数值。    相当于这样的语句   n*8;   
所以就会报错。   
你可以选择直接输出。  System.out.println("2*8="+(num<<3));
或者  num = num <<3 ;  这种方式。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
似水像火 发表于 2013-3-29 17:48
开两个窗口看你的题目.伤不起啊!
num

疯狂讲义?哪有啊
回复 使用道具 举报
赵崇友 发表于 2013-3-29 17:47
嗯嗯,明白了!!谢谢,还想问问 我那编译确实还有那注释的信息,什么情况啊? ...

那是系统提示报错的语句,你把注释移动到下一行后,下一行语句是正确的,所以就没有了。
回复 使用道具 举报
赵崇友 发表于 2013-3-29 17:45
哦哦,明白了!!还有那编译提示  把注释信息也显示了,怎么讲啊?

那是显示的错误语句,并非编译结果
回复 使用道具 举报
fighting 发表于 2013-3-29 18:11
那是显示的错误语句,并非编译结果

注释掉的语句不应该显示出来啊?
回复 使用道具 举报
李晓峰 发表于 2013-3-29 18:00
那是系统提示报错的语句,你把注释移动到下一行后,下一行语句是正确的,所以就没有了。 ...

语句应该不是以分号划分嘛!!再说注释不是错误语句吧!!
回复 使用道具 举报
本帖最后由 李慧声 于 2013-3-29 18:21 编辑

既然不是语句,那应该就是有返回值喽,所以从新定义一个int变量b,接受num<<3的返回值,再输出返回值b,就OK了。
int b = num<<3;
System.out.println("2*8="+b));或者
System.out.println("2*8="+(num<<3));//输出语句
我想和n+1,n++的道理应该是一样的,n+1是有返回值的,而n++是没有返回值的,有返回值就要去接收返回值。
回复 使用道具 举报
赵崇友 发表于 2013-3-29 18:15
注释掉的语句不应该显示出来啊?

这个你去研究编译器好了,这不是重点,
编译器编译语句时有错误,就会把这一行显示出来
回复 使用道具 举报
赵崇友 发表于 2013-3-29 17:45
哦哦,明白了!!还有那编译提示  把注释信息也显示了,怎么讲啊?

当程序出错时,JVM会将当然错误的地方一直到整句最后,都打印出来的,当然会包含注释的部分了
回复 使用道具 举报
这个和 你写  2*8  是一样的  不是正确语句  应该写成num=num<<3;
回复 使用道具 举报
这个和你写 2*8 是一样的 错误语句 你需要定义一个变量来装这个值 例如int a=0;  这个你可以写成num= num<<3;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马