1个回答
展开全部
首先,turbo c++和turbo Pascal是两种不同的语言.
只是在早期,现在的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循环如何循规蹈矩,这些都不是太重要。
11.pascal不支持多重继承,只能由单一的父亲,而c++允许多父亲。如果大家用果BC提供的TV编程,那么一定看过TV的源代码,你会发现他和delphi的vcl多么类似,但是他毕竟是c++写的,采用了很多多重继承,delphi后来重新写了她。从oop的未来发展来看,并不提倡多重继承,java类似pascal也不支持这样操作,这从根本上降低了类的复杂度和可读性。
12.pascal原来没有重载、多态这些该概念,现在的borland把pascal完善的已经脱胎换骨了。
13.pascal至今仍没有c++的友元。他所谓能做到的只是可以访问同一个unit的其他类的私有变量。现在的编程中,大家应该尽量避免使用友元了。
14.pascal的所有类都是TObject的子孙,实际你什么都不写
aaa=class();
end;
仍然等效与
aaa=class(TObject);
end;
这样所有的类指针都能用TObject来转换,而且他在TObject里面已经做到了一些基本的类的初始化、析构和操作符重载。这是c++的不及。
15.所有的pascal必须显式声明构造函数,即使你里面什么也不写。而c++可以没有。
16.pascal所有的类都是在堆中申请,统一管理,各个类的互相操作都在堆里面进行。而c++却可以在堆、栈和数据区里面存在,这样各个不同区域的类相互访问,成了c++需要解决的一个复杂问题。
17.基于上面的原因。
比如一个类TDemo,
再C++里面可以写成
TDemo*demo=new TDemo();
TDemo demo;// 直接创建实体
但是在pascal里面就必须写成
Demo:TDemo;
Demo:=TDemo.Create();
18.还有个问题,就是字符串。
现在可以说pascal的字符串操作性比c++要强大。它可以直接的+,而c++却不行,这得主要原因是c++太接近底层操作了。
19.还是字符串
pascal的字符串分为长字符串和短字符串,他们的开始string[0],这个[0]里面实际保存的是字符串的长度,长字符串是4个字节,表示4G长度的字符串,短的1个字节,最多长度255,而不像c++是结为\0表示结束。
pascal这样的好处很多,比如你想得到一个字符串的长度,c++需要扫描整个字符串,直到遇到\0才能统计出来大小,而pascal直接读[0]就行了,这个效率你可以从编译后产生的汇编代码来看。
还有一个好处就是对于多字节字符串支持,比如unicode,由于是16bit的,里面会出现很多\0,这就与c++的字符窜的结束符号冲突,c++为了解决不得不变成\0\0来表示结束。而pascal却不用任何变化。
只是在早期,现在的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循环如何循规蹈矩,这些都不是太重要。
11.pascal不支持多重继承,只能由单一的父亲,而c++允许多父亲。如果大家用果BC提供的TV编程,那么一定看过TV的源代码,你会发现他和delphi的vcl多么类似,但是他毕竟是c++写的,采用了很多多重继承,delphi后来重新写了她。从oop的未来发展来看,并不提倡多重继承,java类似pascal也不支持这样操作,这从根本上降低了类的复杂度和可读性。
12.pascal原来没有重载、多态这些该概念,现在的borland把pascal完善的已经脱胎换骨了。
13.pascal至今仍没有c++的友元。他所谓能做到的只是可以访问同一个unit的其他类的私有变量。现在的编程中,大家应该尽量避免使用友元了。
14.pascal的所有类都是TObject的子孙,实际你什么都不写
aaa=class();
end;
仍然等效与
aaa=class(TObject);
end;
这样所有的类指针都能用TObject来转换,而且他在TObject里面已经做到了一些基本的类的初始化、析构和操作符重载。这是c++的不及。
15.所有的pascal必须显式声明构造函数,即使你里面什么也不写。而c++可以没有。
16.pascal所有的类都是在堆中申请,统一管理,各个类的互相操作都在堆里面进行。而c++却可以在堆、栈和数据区里面存在,这样各个不同区域的类相互访问,成了c++需要解决的一个复杂问题。
17.基于上面的原因。
比如一个类TDemo,
再C++里面可以写成
TDemo*demo=new TDemo();
TDemo demo;// 直接创建实体
但是在pascal里面就必须写成
Demo:TDemo;
Demo:=TDemo.Create();
18.还有个问题,就是字符串。
现在可以说pascal的字符串操作性比c++要强大。它可以直接的+,而c++却不行,这得主要原因是c++太接近底层操作了。
19.还是字符串
pascal的字符串分为长字符串和短字符串,他们的开始string[0],这个[0]里面实际保存的是字符串的长度,长字符串是4个字节,表示4G长度的字符串,短的1个字节,最多长度255,而不像c++是结为\0表示结束。
pascal这样的好处很多,比如你想得到一个字符串的长度,c++需要扫描整个字符串,直到遇到\0才能统计出来大小,而pascal直接读[0]就行了,这个效率你可以从编译后产生的汇编代码来看。
还有一个好处就是对于多字节字符串支持,比如unicode,由于是16bit的,里面会出现很多\0,这就与c++的字符窜的结束符号冲突,c++为了解决不得不变成\0\0来表示结束。而pascal却不用任何变化。
微测检测5.10
2023-07-11 广告
2023-07-11 广告
信噪比测试是用来衡量音响器材的噪声抑制能力,通常采用以下步骤进行测试:1. 建立指定的输出参考电平并正确接好输入端,操作测量仪器,使这一电平成为0dB的基准值。2. 取消信号源,此时仪表指示的就是信噪比,但是表示成负值,比如,90dB的信噪...
点击进入详情页
本回答由微测检测5.10提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询