编译系统所带来的语言特性的不同

原创 2004年07月31日 00:06:00

                                

不同的编译环境(vcbcturbo pascal等等)在处理一些语句的时候存在着很大的不同,这样就引起了一些相同的语句在不同的编译环境下有着不同的结果。下面举例给予说明:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1、为变量分配的空间不同:对于int  i ,double j.这两个语句在vc6.0环境下编译运行的时候,系统为 i,j 分配的空间分别是48个字节。但是在tc环境下编译运行的时候,系统为 i,j 分配的空间分别是24个字节。如果不熟悉这些编译系统的不同特性的时候,有时候会出现一些错误。例如:在不同的编译平台编写的程序之间交换数据的时候,就会因为分配空间的不统一而出现取错数据的情况。在vc6.0有解决这种不匹配的方案。

2、大家有没有想过为什么在c/c++语言中,int a[][20]能够正确的定义一个二维数组,而int a[20][]却不是正确的定义呢?这就关系到编译系统在处理数组的时候的不同。在c/c++语言中,数组的编址方式是行优先的,在上面的第一种定义方式中,如果你要访问a[10][0]这个元素的时候,你可以根据数组a的第一个元素的地址来得到a[10][0]的地址,地址(a[10][0]=地址(a[0][0]+10*20*2。但是对第二种定义方式,你并不能通过a的第一个元素的地址获得a[10][0]的地址。因为有这样的问题发生,所以c/c++语言就做出了相应的定义规定。但是对一些数组的编址方式是列优先的语言来说,第二种方式就是正确性,第一种定义方式却是错误的了。

3、大家知道,在c++中,形参的初始化是按从左到右的顺序,这主要跟c++函数的参数压栈方式有关。C++的这种特性导致了在使用默认参数的函数的时候必须注意一个规则:在有默认值的形参右边,不能出现无默认值的形参。下面举个例子说明一下:例如void try(int j, int k=2, int m),由于形参的初始化是按左到右的顺序,所以如果用try(1,2)的方式调用函数的时候,程序员本意是调用try(1,2,2),但是在vc6.0环境下进行编译的时候编译器却认为程序员是为j赋值为1k赋值为2,没有为m赋值,所以vc6.0认为出错了。为了避免出现这种不必要的错误,就定了那么一个规则。有些语言中规定了形参的初始化是按从右到左的顺序,规则就反过来了。

4、最后举一个例子,请看下面的问题。

int w,z,x,y;

w=5;x=4;

y=w++*w++*w++;

z=--x*--x*--x;

请问一下最后W,Z,X,Y的值为多少呢?

这个问题采用不同的编译器实现有不同的结果。在vc6.0环境下,对于y=w++*w++*w++,计算机是这样做的:先取w值进行连乘,然后w进行3次自加,就是y=5*5*5=125; w=8。对z=--x*--x*--x,计算机是这样做的:首先x自减两次,取x相乘,x再自减一次,再和上次相乘的结果相乘。因此,z=2*2*1=4;x=1。但是在vc.net环境和Bc3.1环境下,结果并不是这样的:对于y=w++*w++*w++,计算机是这样做的:先取w值进行连乘,然后w进行3次自加,就是y=5*5*5=125; w=8;z=--x*--x*--x,计算机是这样做的:首先x自减三次,取x相乘。因此,z=1*1*1=1;x=1。为什么会出现这样的不同呢?因为对于语言标准没有定义的语法特性,各种编译器都出于自己的考虑做了自己的处理(虽然有些处理在我们看来不可理喻的)。

 

因为编译器的不同引起相同语句有不同处理的情况还有很多,本文就不打算一一列举了。本文的目的是为了引起大家对不同编译器的处理多做些思考和比较,这些对深入的学习计算机语言有着很大的帮助。

解释型语言和编译型语言的区别

解释型语言和编译型语言的区别 首先,我们编程都是用的高级语言(写汇编和机器语言的大牛们除外),计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算机才能运行高级...
  • u012875880
  • u012875880
  • 2013年11月24日 17:58
  • 18929

解释性语言和编译性语言的区别

解释性语言和编译性语言的区别 计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。 翻译的方式有两种,一个是编译,一个是...
  • baidu_15615203
  • baidu_15615203
  • 2015年10月04日 10:16
  • 1211

编译语言、解释语言与脚本语言之间的区别

资料一: 1、解释型语言与编译型语言的区别翻译时间的不同。。 编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了。 解释...
  • wm_1991
  • wm_1991
  • 2016年07月07日 20:00
  • 6919

为常用的工具和语言自定义Sublime Text的编译系统

Custom Sublime Text Build Systems For Popular Tools And Languages【为常用的工具和语言自定义Sublime Text的编译系统】惯例上链...
  • u012566895
  • u012566895
  • 2016年02月01日 11:10
  • 5577

lcc:32位C语言编译系统

  • 2012年01月10日 13:31
  • 2.92MB
  • 下载

论文《编译系统中数据流分析研究》

  • 2008年01月08日 20:19
  • 441KB
  • 下载

VisuaI C++6.0编译系统部分功能介绍

  • 2011年10月19日 17:49
  • 2.44MB
  • 下载

编译系统词法分析

  • 2015年12月13日 14:35
  • 9KB
  • 下载

一个汉字行编译系统程序

  • 2011年05月06日 23:12
  • 1.94MB
  • 下载

在Windows环境下编译系统应用源码

  • 2013年02月23日 14:24
  • 61KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译系统所带来的语言特性的不同
举报原因:
原因补充:

(最多只允许输入30个字)