黑马程序员技术交流社区
标题: 关于移位操作符的小疑惑 [打印本页]
作者: 赵崇友 时间: 2013-3-29 16:28
标题: 关于移位操作符的小疑惑
本帖最后由 赵崇友 于 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)
作者: 丁一 时间: 2013-3-29 16:44
num<<3;//左移3位相当于乘以8 这句肯定错,没啥好解释的吧 我这只报一个错误 后面的没有啊
作者: 赵崇友 时间: 2013-3-29 16:52
丁一 发表于 2013-3-29 16:44
num
俺是菜鸟,不懂,还是解释解释吧!!另外,我这运行 后面确实有啊
作者: 丁一 时间: 2013-3-29 16:55
赵崇友 发表于 2013-3-29 16:52
俺是菜鸟,不懂,还是解释解释吧!!另外,我这运行 后面确实有啊
童鞋 俺也是刚开始学Java , num<<3; 只知道这个是语法错误, 其他的我也不知道怎么解释了:lol
作者: fighting 时间: 2013-3-29 16:59
num = num<<3;
式子要有等号啊,要不怎么能是语句呢
作者: HM李超 时间: 2013-3-29 17:02
"//"是用来注释的,编译器在碰到这个符号,就忽略后面的内容,因为不是Java语句,所以这里不会报错,
报错的仍然是num<<3;这句,你看错误提示就知道了啊,num<<3仅仅是一个表达式而已,运算结果必须用一个变量保存起来才行,
例如,num=num<<3;就行了。这就相当于你在语句里写一句“int a=0;a+1;”效果一样,照样报同样的错误!a+1这句没保存结果啊
作者: 赵崇友 时间: 2013-3-29 17:45
fighting 发表于 2013-3-29 16:59
num = num
哦哦,明白了!!还有那编译提示 把注释信息也显示了,怎么讲啊?
作者: 赵崇友 时间: 2013-3-29 17:47
HM李超 发表于 2013-3-29 17:02
"//"是用来注释的,编译器在碰到这个符号,就忽略后面的内容,因为不是Java语句,所以这里不会报错,
报错 ...
嗯嗯,明白了!!谢谢,还想问问 我那编译确实还有那注释的信息,什么情况啊?
作者: 刘胜寒 时间: 2013-3-29 17:48
开两个窗口看你的题目.伤不起啊!
num<<3;//这句话 明显有错误,要有=号的。
左移三位不一定就是num*8,你把num搞大一点,或者换成byte类型。就会知道了?
位移的速度比乘八的速度快,这个可以节省点时间,ACM比赛这种用法比较常见。
“<<"这个是无符号位移,"<<<"这个是有符号位移,建议你看java疯狂讲义(第二版)第三章第七节
希望对你有帮助,可以私密我
作者: 殇_心。 时间: 2013-3-29 17:51
本帖最后由 殇_心。 于 2013-3-29 17:52 编辑
因为 num<<3 这是一个数值。 相当于这样的语句 n*8;
所以就会报错。
你可以选择直接输出。 System.out.println("2*8="+(num<<3));
或者 num = num <<3 ; 这种方式。
作者: 赵崇友 时间: 2013-3-29 17:57
似水像火 发表于 2013-3-29 17:48
开两个窗口看你的题目.伤不起啊!
num
疯狂讲义?哪有啊
作者: 李晓峰 时间: 2013-3-29 18:00
赵崇友 发表于 2013-3-29 17:47
嗯嗯,明白了!!谢谢,还想问问 我那编译确实还有那注释的信息,什么情况啊? ...
那是系统提示报错的语句,你把注释移动到下一行后,下一行语句是正确的,所以就没有了。
作者: fighting 时间: 2013-3-29 18:11
赵崇友 发表于 2013-3-29 17:45
哦哦,明白了!!还有那编译提示 把注释信息也显示了,怎么讲啊?
那是显示的错误语句,并非编译结果
作者: 赵崇友 时间: 2013-3-29 18:15
fighting 发表于 2013-3-29 18:11
那是显示的错误语句,并非编译结果
注释掉的语句不应该显示出来啊?
作者: 赵崇友 时间: 2013-3-29 18:16
李晓峰 发表于 2013-3-29 18:00
那是系统提示报错的语句,你把注释移动到下一行后,下一行语句是正确的,所以就没有了。 ...
语句应该不是以分号划分嘛!!再说注释不是错误语句吧!!
作者: 李慧声 时间: 2013-3-29 18:18
本帖最后由 李慧声 于 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++是没有返回值的,有返回值就要去接收返回值。
作者: fighting 时间: 2013-3-29 18:28
赵崇友 发表于 2013-3-29 18:15
注释掉的语句不应该显示出来啊?
这个你去研究编译器好了,这不是重点,
编译器编译语句时有错误,就会把这一行显示出来
作者: HM李超 时间: 2013-3-29 21:53
赵崇友 发表于 2013-3-29 17:45
哦哦,明白了!!还有那编译提示 把注释信息也显示了,怎么讲啊?
当程序出错时,JVM会将当然错误的地方一直到整句最后,都打印出来的,当然会包含注释的部分了
作者: 杜加璇 时间: 2013-3-29 22:06
这个和 你写 2*8 是一样的 不是正确语句 应该写成num=num<<3;
作者: 杜加璇 时间: 2013-3-29 22:13
这个和你写 2*8 是一样的 错误语句 你需要定义一个变量来装这个值 例如int a=0; 这个你可以写成num= num<<3;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |