C语言与PASCAL语言有什么区别

C语言与PASCAL语言有什么区别,第1张

C 和 Pascal 曾经不太像,但是越来越像。

现代 C 语言借鉴了很多 Pascal 的概念:

例如,古老的 C 语言的类型检查很弱,没有函数原型。但今天的 C/C++ 语言支持函数原型(而且不提倡用旧的函数风格),类型检查机制几乎和 Pascal 一样严格。古老的 C 语言曾经只能靠指针存取外界的变量,很不安全,但今天者念带 C/C++ 的引用参数则是相当类型安全的。而引用参数和 Pascal 的 var 参数如出一辙。

另外,Pascal 语言本身也经过了巨大的发展,Borland 功不可没。

今天人们用的 Pascal 几乎就是 Turbo Pascal 或 Delphi 的 Object Pascal。N.Wirth 时代的

program Name(input, output)

const a = 1

type t = packed array of char

var i: integer

begin

writeln('这是一个古董Pascal程序')

end.

还有几个人认识?一个软件就是一个 program begin end,不能分模块,岂不要疯掉?

现代首芦 Pascal 语言也借鉴了许多 C 语言的概念,如缺省参数值、无变量变体记录:

type

TPoint = record

case integer of

0: ( x, y: extended )

1: ( radius, angle: extended )

end

case 部分不是 case type: integer of 而是 case integer of,实际上跟 C 语言的 union 一样了。

至于借鉴的数据类型(如 smallint, longint, 无类型指针 Pointer,类型参数)和强制类型转换机制,就更不用提了。

今天 Pascal 的文件处理,也有点模仿 C 语言,跟以前是天壤之别,谁还记得 Old Pascal 的 get/put *** 作?

说这么多相似,其实也衬托了当年的不相似。语言的发展趋同,不同的( {} 与 begin..end )往往都是鸡毛蒜皮。

今天还有的比较重要的区别:

1. Pascal 支持子程序嵌套高培,C 否。因为 C 的设计目标之一就是与机器语言的结构直接对应。

2. Pascal 子程序分过程/函数,C 只有函数。

3. Pascal 类型更严格,如 char, boolean 都是特殊的枚举类型,而枚举与整型不是一回事,必须用 Ord() 转换。

而 C 的 char、enum 都被当作整型。

4. C 支持可变参数 void f(int x, ...),Pascal 没有。

5. C/C++ 的模块机制是头文件的文件包含+*.obj文件的连接,文件包含属于文本 *** 作,编译速度很慢。而 Pascal 是 unit 的连接,二进制 *** 作,编译速度飞快(对开发大型软件还是很重要的)

6. C 语言的结构/数组的初始化只用给出数值,而且元素个数可以比定义的少;而Pascal必须明确指出分量名称,个数严格对应:

var Point: TPoint = ( x: 100, y: 200 )

7. C 的标志符大小写敏感,Pascal 否。

8. C 编译预处理功能比 Pascal 的强大,实践中也很重要(它弥补了 C 编译器的许多不足)。

9. 很容易被忽视也很重要的一条:两者的表达式不同。

9.1. C/C++ 的表达式被赋予了太多的使命,连赋值语句本身也是表达式,a = b 同时返回 a,因此可以写 a = b = c 而 Pascal 对赋值号被严格当作一个规定好的 *** 作:赋值,别无其它,你不能写 a := b := c。

9.2. C/C++ 的表达式的类型严格取决于源 *** 作数: char a = 100, b = 200 则 a+b 的结果类型仍然是 char,当然就会溢出。Pascal 会“体贴”地替你扩展成足够大的数据类型:

var a, b: smallint c:longint

a := 32768

b := 32768

c := a + b //结果是 65536,在 C 语言中则肯定是 0

归根结蒂,C 贴近机器,骨子里把 *** 作数当作“二进制”处理(这有时是优点,尤其是跟硬件打交道时);Pascal 贴近数学,尽量以数学的视角看待数值。

10. 至于 C 的 for 循环如何强大,Pascal 的 for 循环如何循规蹈矩,这些都不是太重要。

========================================================

我认为最大的区别在于c中的函数内部不允许定义其他函数

但是pascal的过程 函数中允许存在

另外赋值 c用=pascal用:=

还有就是c用{}表示作用域 但是pascal用begin end

关于for循环c可以随意给条件中的变量进行增加和减少如

int i

for(i=0i<100i+=2)

{

}

但是pascal中每次只能增加1(不知道这一点是不是正确,可能跟vb搞在一起了 你就参考一下吧)

=========================================================

从oop来说他们还有些区别。

1. pascal不支持多重继承,只能由单一的父亲,而c++允许多父亲。

如果大家用果BC提供的TV编程,那么一定看过TV的源代码,你会发现他和delphi的vcl多么类似,但是他毕竟是c++写的,采用了很多多重继承,delphi后来重新写了她。

从oop的未来发展来看,并不提倡多重继承,java类似pascal也不支持这样 *** 作,这从根本上降低了类的复杂度和可读性。

2.pascal原来没有重载、多态这些该概念,现在的borland把pascal完善的已经脱胎换骨了。

3.pascal至今仍没有c++的友元。他所谓能做到的只是可以访问同一个unit的其他类的私有变量。现在的编程中,大家应该尽量避免使用友元了。

4.pascal的所有类都是TObject的子孙,实际你什么都不写

aaa= class()

end

仍然等效与

aaa= class(TObject)

end

这样所有的类指针都能用TObject来转换,而且他在TObject里面已经做到了一些基本的类的初始化、析构和 *** 作符重载。这是c++的不及。

5. 所有的pascal 必须显式声明构造函数,即使你里面什么也不写。而c++可以没有。

6. pascal所有的类都是在堆中申请,统一管理,各个类的互相 *** 作都在堆里面进行。

而c++却可以在堆、栈和数据区里面存在,这样各个不同区域的类相互访问,成了c++需要解决的一个复杂问题。

7. 基于上面的原因。

比如一个类 TDemo,

再C++ 里面可以写成

TDemo *demo= new TDemo()

TDemo demo// 直接创建实体

但是在pascal里面就必须写成

Demo: TDemo;

Demo:= TDemo.Create()

8.还有个问题,就是字符串

现在可以说pascal的字符串 *** 作性比c++要强大。

他可以直接的+,而c++却不行,这得主要原因是c++太接近底层 *** 作了。

9.还是字符串

pascal的字符串 分为长字符串和短字符串,他们的开始string[0],这个[0]里面实际保存的是字符串的长度,长字符串是4个字节,表示4G长度的字符串,短的1个字节,最多长度255,而不像c++是结为\0表示结束。

pascal这样的好处很多,比如你想得到一个字符串的长度,c++需要扫描整个字符串,直到遇到\0才能统计出来大小,而pascal直接读[0]就行了,这个效率你可以从编译后产生的汇编代码来看。

还有一个好处就是对于多字节字符串支持,比如unicode,由于是16bit的,里面会出现很多\0,这就与c++的字符窜的结束符号冲突,c++为了解决不得不变成\0\0来表示结束。而pascal却不用任何变化。

10......还有好多,我一时想不起来了

开头的{}表示的是棚嫌谈编译开关,uses是调用单元用的。

自己总结了点:

常用的单元有:

sysutils:关于日期和时间

crt:关于声音和图形,屏幕控制,键盘扩展

math: 顾名思义,有关于数学

dos: 系统命令

system: 默认的,不用添加。

printer: 支持打印输出 *** 作。

graph: 高级图形软件包,直至图形适配器。

overlay: 实现高级覆盖管理。

下面是一些常见开关所代表的意思:

1)数据对齐(Align Data)

{$A+}或{$A-}

在{$A+}状态下,将非字符按偶地址对齐存放,可以提高8086和80286存取数据的速度。不影响字节变量、记录域结构和数组元素。在{$A-}状态下,将使用字节对齐方式,数据可存放在奇地址或偶地址。

2)布尔运算(Boolean Evaluation)

{$B+}或{$B-}

在{$B+}状态下,编译器产生完全布尔表达式运算代码。布尔表达式中的每个 *** 作都确保被计算。既是整个表达式的结果以确定,还继续运算其余的表达式。

在{$B-}状态下,编译器产生短路布尔表达式运算代码。接着从左到右运算,当整个表达式结果确定后,就停止运算。

3)调试信息(Debug Information)

{$D+}或{$D-}

{$D+}产生调试信息,它在编译程序或单元产生运行错误时,能自动定位引起错误的语句。

4)浮点仿真(Emulation)

{$E+}或{$E-}

{$E+}只是在8087协处理器不存在时,将连接运行库以便对协处理器进行仿真。

{$N+,$E+}状态编译程序,系统将同8087仿真器连接,得到exe文件,不管有无8087,都可以在机器上进行IEEE标准754的二进制浮点运算。

{$N+,$E-}状态下,只能在有8087时,才能进行IEEE标准754的二进制浮点运算。

8087仿真开关如果用在一个单元是无效的,它只能用于程序的编译。

5)输入输出检查(Input/Output Checking)

{$I+}或{$I-}

$I指示控制是否自动产生对调用过程的结果进行检查。

6)数字处理(Numberic Processing)

{$N+}或{$N-}

{$N-}状态,在机器上只能进行实数类型者乎运算。在{$N+}状态,在有8087协处理器或没有用{$E+}指示对8087进行仿真,都可以对IEEE浮点类型进行运算。

7)范围检查(Range Checking)

{$R+}或{$R-}

$R+进行边界和范围检查

8)栈溢出检查(Stack Overflow Checking)

{$S+}或{$S-}

在{$S+}状态下编译,程序在每个过程或函数的开始生成一段代码,用于检查是否有足够的栈空间供局部变量使用。若栈空间不够,程序停止运行,并显示运行错误。

在{$S+}状态下这样调用会导致系统崩溃。

9)变量串检查(Var String Checking)

{$V+}或{$V-}

在{$V+}状态下,实行严格的类链碰型检查,要求形参、实参具有同一字符串类型。

在{$V+}状态下,允许任意类型的字符串变量作为实参,甚至是一实参的最大长度不同于形参长度。

BP7下的最佳参数是:

{$A+,B-,D-,E-,F-,G+,I-,L-,N+,O-,P+,Q-,R-,S-,T-,V-,X+,Y-}

{$M 65520,0,655360}

其中D和L与调试有关,调试时必须打开这两个参数

N+可以使程序能够使用扩展实型。一般情况下,Real速度最慢,不应该使用。

c:0:2中,0表蔽隐示保留几位整数,如果不够位数的话用' '代替。如果是0,迅并辩亩缺那么表示不对整数部分进行任何 *** 作。2表示保留几位小数,如果不写c:0:2的话,那么会输出6.28300000+e2。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12266212.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存