窃以为Java 比 C++ 要好的一个语法规则:

 我学了一个半拉子的C++,至于Java更是刚刚开始学,下面的文字决不是说C++绝对比Java好,或者反之的东西,我们都知道只有最合适的语言,没有最好的语言,所以请讨论,但别冲动。
在刚学习C++的时候,我记录了这么一段话:
“C++中当一个函数带有多个参数时,标准中未规定在函数调用时实参的求值顺序,并允许不同的编译系统根据对代码优化的需要自行规定对实参的求值顺序,那么像:

#include<iostream>
using namespace std;
int fun(int,int);
void main()
{
   int x=1,y=1;
   cout<<"result is:"<<fun(++x,x+y)<<endl;
}
int fun(int i,int j)
{
   return i+j;
}
 这样的代码岂不是产生二义性了(其实更简单的例子即可说明),在不同的平台上得到不同的结果,跟“移植”岂不是相悖,那么ANSI C++标准委员会咱不吱声呢?难道有特殊的意义?还望各位高手各抒己见。”

 当时好像发在CSDN里面问了诸高手,也没得到什么有意义的回复。
现在学Java时,知道了:(以下段落摘自JUST JAVA (第二版),这书都出到第6版了,可我只借到这个......)
 "C或C++程序员将很容易熟悉Java中的运算符。有一个新的概念是Java对计算的次序做了新的定义,许多(并不是全部)以前的语言(包括C和C++),没有说明操作数计算的次序。换句话说,像下面这个C表达式中的操作数:
i+a[i]+functioncall();                            (C代码)
 能以任意次序来计算然后加在一起。函数可以在数组引用(即a[i]计算之前,计算中间(在先进的多处理器硬件中)或计算之后调用,加法也能以任意次序执行。
 在上面的表达式中,如果函数”functioncall()"修改i 值,那么总的计算结果将依赖于计算的次序,可能有不同的结果,但这种不确定性不会发生在Java语言中。
 在有些语言中,把计算次序留着不作说明有以下几个理由:
 .语言哲学。由于没有理由要求从左至右计算,语言对此既不承诺,也不禁止。
 .如果编译器的优化器有完全的自由把表达式改变成数学上等价的表达式,那么这样编译器的优化器就容易编写。所着产生的代码执行起来不一定更快,但是优化器更容易建立和维护。
 .容易识别可消去的公共的子表达式和传播的常数,这样的优化经常引起其他一些优化,如循环的展开,而不是人为的代码。
 .它允许编译器的作者有最大的机会来利用寄存器中已经有存在的值。
权衡的结果是有些程序依赖于计算次序可能给出不同的结果,作为一个专业程序员,我们知道这样的程序写得很糟,但是毕竟还是可能存在的。
 Java在不同的地方做了权衡,它认识到在所有的机器上得到相同的结果要比在某个机器上运算得快一些很需要,实际上通过重新安排操作数来加快表达式的计算,这对许多程序来说相当有限,随着处理器速度和性能的改善,在现代语言中应该优化编程的清晰度而不是性能,Java的做法是合适的。
 Java的计算次序是说对所有二元运算符,其左操作数总是比右操作数先计算出来。因此,在表达式b+c*d中,操作数b必须先计算出来,然后再完成乘法(因为优先级决定了乘法的结果才是加法的右操作数。
 从左至右的计算实际上意味着在表达式中的所有操作数(如果它们全部要被计算的话),是按照它们在纸上写下的次序从左至右的一个一个地被计算出来的,有时计算的结果必须暂时被存储,因为要进行更高优先级的运算。尽管<<Java语言说明>>只讨论了操作数表面的计算次序,但对具体的运算符来说,这是对规则所做的必要的判断。
 当然,有些操作数可能一点也没有被计算,比如"||"和"&&"的计算,当表达式中得到的结果足以表示整个计算结果时计算就停止了。可以预见计算在哪儿停止是一个要比数字优化更重要的优点为。
 在Java中,不仅操作数的计算,而且所有其它东西的次序都是被定义好的,特别是:
 .二元运算符的左操作数总是比右操作数先计算出来。即使对于赋值运算符也是这样,必须先计算左操作数(存储结果的地方),然后再计算右操作数(结果是什么)。
 .在数组引用中,在方括号”[]“之前的表达式完全计算出来,然后再计算索引(下标)部分。
 .调用一个对象方法的一般形式为:
object_instance.methodname(arguments);
"object_instance"总是在能看到methodname和arguments之前被完全计算出来,然后所有的参数一个一个按照从左至右的次序逐个计算。
 .在多维数组表达式中,维数表达式是按从左至右的次序逐个进行的。
《语言规范》用了这样的话,即”Java保证对运算符来说操作数显得是按从左至右的次序被计算的”。这是一个例外条款,从而允许聪明的编译器作者进行更好的优化,只要维持左至右计算的现象。"

这段话彻底打消了我当初的那些疑惑,所以我完全同意以上作者的说法,认为这个年代下计算次序的确定性是Java比C++好的一个语法规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值