近日来很迷惑,在JAVA中括号用在表达式中和调用方法处,还有定义方法处。
这三处中哪一处算是运算符。查过积木死狗司令(JAVA之父)的<<java语法规范V3>>上面居然无运算符优先级,<<java core>>中运算符优先级表上第一列是" . (param) []" 这个(param) 是方法调用,看来是把调用方法处这个括号作为运算符了,这对吗?(我本人感觉是不对的) 表达式中的括号却在该表中未出现,看来是没有当成运算符了,这又对吗?
<<java core>>本是牛书,可是(JAVA之父)出的书也不敢小瞧,还有国内的教材书等,这些书我都把运算符优先级表对比了一下,一个比较令人生气的问题出现,那就是运算符优先级表不尽相同,虽大同小异,但细节之处各说各的。严谨的JAVA怎么能这样哪?唉。只请高人指教一下,到底括号用在何处算是运算符?
这三处中哪一处算是运算符。查过积木死狗司令(JAVA之父)的<<java语法规范V3>>上面居然无运算符优先级,<<java core>>中运算符优先级表上第一列是" . (param) []" 这个(param) 是方法调用,看来是把调用方法处这个括号作为运算符了,这对吗?(我本人感觉是不对的) 表达式中的括号却在该表中未出现,看来是没有当成运算符了,这又对吗?
<<java core>>本是牛书,可是(JAVA之父)出的书也不敢小瞧,还有国内的教材书等,这些书我都把运算符优先级表对比了一下,一个比较令人生气的问题出现,那就是运算符优先级表不尽相同,虽大同小异,但细节之处各说各的。严谨的JAVA怎么能这样哪?唉。只请高人指教一下,到底括号用在何处算是运算符?
1。(param)处的括号不是运算符,比如public void doSomething(int a,String b){},此处括号
是用来囊括住方法或函数所需要用的参数。
2。表达式中的括号是运算符,比如 int a =1;int b=2;int c=3;a=a*((b+c)-a); 这里的括号是运算符。当括号作为运算符时,优先级别是最高的。
3。还有就是在if,for,while等语句中用到,也是运算符。比如:int a=5;int b=6; if(a>b){} 此处括号就是运算符,先将a>b作运算,得到一个boolean值(true或false)。
lz没有必要过于去关注这些东西。lzmhehe(小飞飞) ( ) 信誉:100 Blog
说的对,多用几个()就ok了
不过你也不会出现a.(b)这样的情况不是?你想如果是(A=B).methord();肯定是先将作()里面的运算
至于它是不是运算符,我觉得没必要深究,反正多用几个(当然别用错)肯定没什么问题。可读性也高啊
引起操作的符号都是运算符。. //属性寻址
() //函数调用
[] //下标操作三个都是。改变运算优先级的()可以不算在内。>>严谨的JAVA怎么能这样哪?
不要随便归咎责任……>>那个.运算符和圆括号,哪个优先级更高一些,书上说都是1级的,大家认为呢?
真无聊……
假设作为函数调用的()是运算符。而对于下面方法调用
this.f();又是正确的.
那么因为.和()都是1级,左结合性。则上面的便相当于
(this.f)();
而这又是编译报错的。看来跟this.f()不同.说明假设错误。
说明函数调用的()不是运算符。
不知上面的反证法对吗?还请高人指教。请楼上的指点迷津。:)
this.f();
(this.f)();这两句肯定是不一样的。Java中方法不能作为独立的对象,this.f本身不是一个合法的表达式,加上扩号自然不对。不过这在有些语言里面是正确的,比如在Python中称为unbound method。在支持运算符重载的语言中就可以看到(典型如C++和Python),"()"、"[]"、"."(Python)/"->"(C++)都是可以重载的。
是bound method。
不会影响运算速度……