问题描述
- java读取代码顺序是从左往右还是从右往左
-
java编译器读取每行代码顺序是从左往右还是从右往左 例如
int a=1;
int b=2;
int c=3;
int d=a+b*c
int d=a+b*c是从左往右读取还是按优先级读取
编译器读取每行代码都是从左往右读取吗
解决方案
也许你觉得从左到右是很天经地义的事情。
偏偏阿拉伯文就是从右到左的。
我们知道,windows、office这些软件都有阿拉伯语言的版本,也能正确处理这些语言。
那么微软是否需要为这些国家或者地区的人重新设计一种软件呢?希捷和日立有没有必要为这些人设计一种反过来转的硬盘呢?Intel需不需要设计一种反过来表示数字的cpu呢?
答案是都不需要。因为我们只需要稍微调整软件算法就可以实现了。
甚至可以多说一些给你(你不用深究,为了简化讨论,这里说的只是一个简化过的概念),我们用的Intel处理器,在它的内部,数字表示的形式是反过来的,比如123,实际上它存的是321。
当然,另外一些计算机,比如你的手机上用的cpu存储的是正的123。你在使用的时候发现它们有这样的不同了么?也许我不说你一辈子也感觉不到。
这就是说,其实一个东西的内部原理,其实和它表现的形式并不重要。为什么intel的处理器数字内部存储的都是反的显示出来不是反的呢?因为它怎么设计的我们管不了,但是它运行程序输出的结果如果是反的让我们看见了,我们就不会用它了。
解决方案二:
只要是正常人的思维,编写一个编译器,读取源代码,而且源代码本身的书写就是从前往后从上往下的,你说应该怎么读取?当然是从前往后,从左往右。
这没有任何问题。但是这不重要。换一句话说,即便一个人思维特别奇怪,他也可以设计一个编译器从后往前读取程序,或者另外一种方式读取。
编译器的实现是按照语言规范来的。请注意这个基本的前提。换一句话说,语言规范决定了a+b*c中,先算b*c,再算a+这个值。无论你怎么设计程序,无论你怎么读取,你产生的代码符合这个规范,你写的编译器就是没问题的。否则就是有问题的。
编译器从前往后读取,但是表达式中有括号,有优先级,那么怎么解决这个问题,是编译器自己的事情(一些编译器,或者说基本上所有的编译器都使用堆栈解决这个问题)。
编译器不能因为它从左往右读取程序就编译不出正确的程序,这非常荒谬。
请注意,a+b*c和a+a++这两个表达式有本质的不同,后者是未定义的,语言规范没有规定遇到副作用表达式,如何理解其中的变量是否可变,以及是否需要在应用副作用表达式(而不是求值)之后重新求值。
前者就是一个确定的表达式,有确定的运算优先级。
解决方案三:
你的思维有个很大的问题,就是你没有从本质上去思考问题,而是纠结一些细节,并且这些细节涉及到很多你不知道的概念,
比如你去买一辆汽车,你说汽车可以开得那么快是因为它是内燃机的活塞驱动曲轴然后让轮子转动的么?其实这不重要,重要的是,汽车只有能开它才是汽车,你才会去买。
反过来说,汽车只要达到这么目的,用电机驱动,甚至未来用电磁超导驱动,又有什么关系呢?
汽车能开的根本原因是设计者出于让它能开的目的而设计它,而不是因为它具体使用了什么技术和方式,以及什么构造和原理所以它能开。
一个道理,Java如何处理表达式是语言规范决定它必须实现这样的设计意图,而不是因为它采用了什么具体的方法,比如用什么顺序去解析表达式,所以才表现出这个行为。Java编译器是人设计的,这个能明白么?
如果有一种语言叫做avaJ,它规定a+b*c先算a+b,再算b*c,只要有这个需求,不管它是不是很奇怪,我们一样可以设计出一个解析它的程序来。
解决方案四:
int d=a+b*c是从左往右读取还是按优先级读取
这里的等于号是赋值,所以等号右边必须有值,所以对于它来说就是从右往左的,因为是等号右边的运算式运算后赋值给等号左边的变量。
而等号右边的a+b*c,这个就是小学时候的东西了,有括号先算括号,没有括号就先乘除后加减的,对于这个式子来说先b*c,然后a+;这个不用区别什么从左往右还是从右往左的,反正你知道是计算就行了。
解决方案五:
我的意思是编译器先从左往右扫描读取表达式后在计算还是一遇到表达式就按优先级高的计算
解决方案六:
首先是从右往左,接着根据运算符运算
解决方案七:
根据运算符运算,接着从左到右
解决方案八:
根据运算符运算,接着从左到右
解决方案九:
根据运算符运算,接着从左到右
解决方案十:
从左往右啊,不过纠结这个干什么