-
java编译器与C编译器的区别10
其实很简单 一个关于运算符的问题 为什么在不同的编译器下会得到不同的结果 题目是
int i=3,k=0;
k=(++i)+(++i)+(++i);
System.out.println(k);
在C中是
printf("%d\n",k);
同样的题目为什么会有不一样的结果,答案是
在java中的 15
在linux 下用gcc编译是16
而用turbo C 得到的结果却是 18
这些编译器上存在些什么区别呢?2009年7月08日 19:49
4个答案 按时间排序 按投票排序
-
采纳的答案
跟语言规范中的规定相关。如果语言规范对某些行为没有严格定义,那么编译器的实现就可以自行发挥。
Java的语言规范明确规定了表达式的求值顺序是从左向右(15.7小节)。楼主的代码里,每个++i都是双目运算符+的操作数根据从左向右的求值顺序,要求第一个+的值,就必须先求第一个++i的值,结果是3+1;然后求第一个+右边的操作数,是“(++i) + (++i)”,于是重复求值过程,第二个++i就是4 + 1,第三个++i就是5 + 1,全部加起来就是15。由于语言规范做了严格的规定,所有符合规范的Java编译器都应该编译出同样效果的程序。
C语言则没有规定表达式的求值顺序,也没有严格规定“一个完整表达式里副作用的顺序”。C99语言规范写明++E完全等价于(E+=1)(6.5.3.1小节)。赋值表达式的规定在6.5.16,说赋值表达式的副作用应该发生在前一个和后一个顺序点之间,并且求值顺序未定义。关于顺序点的规定在附录C,楼主代码中,int i = 3, k = 0;
这句有两个顺序点,分别是i = 3后的逗号和k = 0后的分号处。k = (++i) + (++i) + (++i);
这整个是一个“表达式语句”,只有一个顺序点,就在末尾的分号处。
根据C99的规定,++i的副作用发生在k=0;之后和(++i);之间的任意位置都可以。所以不同的编译器就采取了不同的实现方式,GCC对该表达式的理解是:i += 1; i += 1; temp = i + i; i += 1; temp += i; k = temp;
Turbo C和VC9的理解是:i += 1; i += 1; i += 1; temp = i + i; temp += 1; k = temp;
而这都是C语言规范所允许的。之所以定义得比较宽松,是为了让编译器实现者能更自由的选用优化方式来产生高效的代码。
无论如何,良好的代码风格中,一个完整的表达式里最好不要有多余一个副作用,不然代码就会难以阅读。在C、C++等没有定义求值顺序的语言中,依赖求值顺序去求表达式的值更是很危险的作法,因为编译器的不同版本间都有可能改变求值顺序,更不提不同编译器间的不同实现。不过了解一下为什么会出现差异还是有好处的……
遇到问题先看规范,没错的。2009年7月08日 23:25
-
呃,抱歉刚才手滑了。TC和VC9的理解是:
i += 1; i += 1; i += 1; temp = i + i; temp += i; k = temp;
前面把一个i打成1了……别问我为什么手滑了 T T2009年7月08日 23:27
相关推荐
在本项目中,"C语言实现的Java编译器"是一个独特的尝试,它将传统的编译原理理论应用于实际编程中,以C语言作为基础来构建一个能够解析和处理Java源代码的工具。这个项目主要涉及两个核心部分:词法分析器(Scanner...
Java编译器,通常被称为Javac,是Java开发工具包(JDK)的重要组成部分,负责将源代码转换为可执行的字节码。在Java编程语言中,编译过程并非像C++或C那样直接生成本地机器代码,而是生成跨平台的中间表示——字节码...
基于Java语言和java图形界面,将C语言的基础语法经过词法分析,语法分析,语义处理翻译为中间代码四元式,再将四元式翻译为标准JVM虚拟机的字节码bytecode,模拟JVM虚拟机实现一个CVM虚拟机,并运行该程序。
3. 性能优化:Java编译器可能在生成高效本地代码方面不如专门的C编译器。 总结,基于Java实现的C语言编译器项目是一个富有挑战性的任务,它涉及到编译原理的深度应用和Java技术的巧妙结合。通过这个项目,开发者...
"windows下的java编译器和jdk.zip"这个压缩包包含了这两个关键组件。 JDK是Java开发的基础,它提供了编译、调试和运行Java程序所需的所有工具。在这个压缩包中,文件`jdk-8u241-windows-x64.exe`是Oracle公司发布的...
本文将详细介绍如何安装和使用Eclipse作为Java编译器。 首先,我们需要了解Java编译器的作用。Java编译器,通常指的是JDK(Java Development Kit)中的javac命令,它将源代码(.java文件)转化为字节码(.class文件...
本项目以“编译原理课程设计:Java实现C语言编译器”为主题,旨在通过实际操作来深入理解编译器的设计与实现过程。以下是关于这个项目的详细知识点: 1. **词法分析**:这是编译器的第一步,也称为扫描或词法分解。...
在本项目中,"基于Java实现的C语言编译器【100012136】"是一个课程设计任务,目标是构建一个能够解析并处理C语言源代码的编译器。这个编译器的实现采用了Java编程语言,这使得它具有跨平台的能力,能够在多种操作...
这是使用java实现的c语言编译器,其中包括Java源代码和c语言的测试程序,包括我们的输出结果的截图和课程设计说明书,如果你的课程设计也是这个的话,用这个肯定够用了,包括词法分析,语法分析,语义分析,分别打印...
此外,对于使用了JNI(Java Native Interface)的代码,反编译器通常无法处理与C/C++代码的交互部分。 9. **反编译器的未来**:随着Java语言和JVM的不断演进,反编译器也在不断发展以支持新的特性,如Lambda表达式...
java比较基本的开发工具,新手建议用中文版的,英文版的不容易操作。
而C语言小型编译器则意味着这个项目旨在实现一个小型版本的C语言编译器,可能主要用于教学或简化版的编译器设计实践。 描述中没有提供具体的信息,但我们可以推测这个项目可能包含一个使用Java Swing设计的前端界面...
### Emeditor配置JAVA编译器 在进行Java开发时,选择一款合适的代码编辑器对于提升编程效率至关重要。Emeditor作为一款强大的文本编辑器,不仅支持多种编程语言的语法高亮显示,还具备丰富的插件扩展功能。本文将...
这款工具的独特之处在于,它不仅包含了一个命令行C编译器,还提供了一个可视化的Java编译器,这对于理解和研究编译过程有着极大的帮助。通过SNLC,用户可以深入学习编译器的工作原理,并亲手尝试构建自己的编译器。 ...
标题中的“自己用c#做的C语言编译器内带测试程序”表明这是一个个人项目,开发者使用C#编程语言创建了一个小型的C语言编译器,并且这个编译器包含了用于验证其功能的测试程序。这涉及到计算机科学中的编译原理、...
总的来说,这个Java实现的C语言编译器项目涵盖了编译器设计的核心概念和技术,同时引入了可视化元素,使得学习和调试编译器变得更加直观。通过理解并实践这样的项目,开发者不仅可以深入了解编译器的工作原理,还能...
本资源提供了一个基于Java实现的C语言编译器源代码,旨在帮助开发者深入理解编译器的工作原理,以及C语言的基本架构。以下将详细介绍其中涉及的知识点。 一、编译原理 编译器是程序开发中的核心工具之一,它主要...
java实现的C语言(部分文法)简单编译器,包括词法分析、语法分析、语义分析,输出四元式,有详细文档
本文将深入探讨基于Java实现的C程序词法编译器的工作原理、设计思路以及其在编程实践中的重要性。 词法分析器,又称为扫描器或 tokenizer,是编译器的第一步,它的主要任务是从源代码中识别出一个个的词法单元,...