java编译器顺序-java读取代码顺序是从左往右还是从右往左

问题描述

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+;这个不用区别什么从左往右还是从右往左的,反正你知道是计算就行了。

解决方案五:

我的意思是编译器先从左往右扫描读取表达式后在计算还是一遇到表达式就按优先级高的计算

解决方案六:

首先是从右往左,接着根据运算符运算

解决方案七:

根据运算符运算,接着从左到右

解决方案八:

根据运算符运算,接着从左到右

解决方案九:

根据运算符运算,接着从左到右

解决方案十:

从左往右啊,不过纠结这个干什么

时间: 2024-09-29 05:23:41

java编译器顺序-java读取代码顺序是从左往右还是从右往左的相关文章

编码准则与Java编译器

我们在写代码时,常常会提到两条原则: 1.方法要尽量短,大方法要分解成小方法: 2.不要重复发明轮子. 我们在强调这两个原则的时候,往往只关注的是代码简洁.易维护等方便我们人的因素,其实这样做还可以大大方便java编译器优化代码. Java编译器优化简介 Java应用程序的编译过程与静态编译语言(例如C或C++)不同.静态编译器直接把源代码转换成可以直接在目标平台上执行的机器代码,不同的硬件平台要求不同的编译器.Java编译器把Java源代码转换成可移植的JVM字节码.与静态编译器不同,java

JVM深入学习笔记一:Java 编译器初探

闲来无事想大概看下Java编译器的执行过程 一. 编译一个文件 首先去搞到源代码.从JDK6开始Java代码开源,放到OPENJDK组织中去,所以从这个网站进行下载: http://hg.openjdk.java.net/jdk6/jdk6/langtools/  下载之后是一个zip包,解压,可以直接导入到eclipse中进行使用,导入之后可能会报错,需要设置一下. 好,下面写一个用作测试的类: import java.util.Arrays; import java.util.List; i

[看书笔记]《深入java虚拟机》——java体系结构(一)

java的这种适合网络环境的能力是由其体系结构决定的,它可以保证安全的.健壮的且和平台无关的程序通过网络传播,在很多不同的计算机和设备上运行. 体系结构包括四个独立但相关的技术:- java程序设计语言- java class文件- java应用编程接口(API)- java虚拟机 用java编程语言编写源代码,把它编译成java class文件,然后再在java虚拟机中运行class文件.当程序运行的时候,它通过调用class文件中实现了java API的方法来满足程序的java API调用.

深入理解Java内存模型(三)——顺序一致性

数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争.java内存模型规范对数据竞争的定义如下: 在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序. 当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此).如果一个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序. JMM对正确同步的多线程程序的内存一致性做了如下保证: 如果程序是正确同步的,程序的执行将具有顺序一致性(sequentially consistent)–

数据结构Java实现02----线性表与顺序表

[正文] 本节内容: 线性结构 线性表抽象数据类型 顺序表 顺序表应用   一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有后继数据元素. 则称这样的数据结构为线性结构.   二.线性表抽象数据类型: 1.线性表抽象数据类型的概念: 线性表抽象数据类型主要包括两个方面:既数据集合和该数据集合上的操作集合. 数据集合: 可以表示为a0,a1,a2,

深入理解Java内存模型(三) 顺序一致性

数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争.java内存模型规范对数 据竞争的定义如下: 在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序. 当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此).如果一 个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序. JMM对正确同步的多线程程序 的内存一致性做了如下保证: 如果程序是正确同步的,程序的执行将具有顺序一致性(sequentially consisten

java数组为什么不可以打乱顺序

问题描述 java数组为什么不可以打乱顺序 public class Arrays { public static void main(String[] args) { // TODO Auto-generated method stub int arrays[][] = { {3,4,6,8,6,8}, {5,3,4,9,9,4}, }; for (int i = 0; i< arrays.length;i++){ for (int j =0; j<arrays[i].length; j++

通过java字节码分析学习对象初始化顺序_java

复制代码 代码如下: mockery.checking(new Expectations() {            {               one(new Object()).toString();               will(returnValue(""));           }       }); 下面写一个写一个简单的类演示这个例子 复制代码 代码如下: public class Test {     int i = 1;    {        int

buffer-在下面的java程序中添加按照字母顺序排序,如何添加

问题描述 在下面的java程序中添加按照字母顺序排序,如何添加 package test1;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.regex.Matcher;import java.util.regex.Pattern; p