您的位置:首页 > 编程语言 > C语言/C++

C、C++、Java

2016-07-04 20:45 253 查看
经常听到有人在抱怨这个语言哪里哪里 不好,那个语言又是如何的优秀。对于这样 的牢骚,我只是一笑而过。 就我而言,语言只是工具,没有好坏之 分。只要你采用相应的语言,完成对应的工 作,那你的目标就完成了。我们无需抱怨这 种语言的缺点,而是应该抱有接受的态度。 任何语言的存在都有它的合理性,如果不合理是不会经受住时间的考验的。世间之物都 具有双面性,只是看利多还是弊大。如果一 个东西是十全十美的,那我毫不犹豫的告诉 你,一种情况是它不存在,另一种情况是你 还没发现它的缺点。 每种语言都有自己得天独厚的优势,当 然缺点同时伴存。

C语言是计算机界的常青 藤。C语言执行效率高,用于写底层的驱动 那是再适合不过。指针是C语言的精华。而 C++是很强大的,只要你是个高手,你几乎 可以利用C++完成任何事情。当然虚函数是 C++的精华。Java取消了指针,这是应该喜 还是忧。喜的是,没有C或者C++那种对内 存繁琐的操作,而且也降低了很多致命性的错误发生的概率。忧的是,效率大打折扣, 采用虚拟机的方式使得Java有跨平台的特 性,必然会使得效率降低。另外一个方面, 你借别人的东西使用(内存),是不是应该 还回去呢?从这一方面考虑,C或者C++的 设计思想更有意义。经常关注TIOBE世界编 程语言排行榜,Java已经有很久排名第 一,我觉得这样的排名只是看看而已,无需 过多的信奉。

下面看看几种主要语言的优缺点。

C语言

C语言的优点:

1.简洁紧凑、灵活方便

2.运算符丰富

3.数据结构丰富

4. C是结构式语言

5. C语法限制不太严格,程序设计自由度大

6. C语言允许直接访问物理地址,可以直接 对硬件进行操作

7. C语言程序生成代码质量高,程序执行效 率高

8. C语言适用范围大,可移植性好

9. C语言有一个突出的优点就是适合于多种 操作系统,如DOS、UNIX,也适用于多种机型

10.有效地将一个较复杂的程序系统设计任 务分解成许多易于控制和处理的子任务,便 于开发和维护

 

C语言的缺点:

1. C语言的缺点主要是表现在数据的封装性 上,这一点使得C在数据的安全性上做的有 很大缺陷,这也是C和C++的一大区别。

2. C语言的语法限制不太严格,对变量的类 型约束不严格,影响程序的安全性,对数组 下标越界不作检查等。从应用的角度,C语 言比其他高级语言较难掌握。

3.可重用性差

4.数据安全性差

5.难以开发大型软件和图形界面的应用软件

6.把数据和处理数据的过程分离为相互独立 的实体

7.当数据结构改变时,所有相关的处理过程 都要进行相应的修改

8.每一种相对于老问题的新方法都要带来额 外的开销

9.图形用户界面的应用程序,很难用过程来 描述和实现,开发和维护也都很困难

 

 

C++

C++优点:

1.可扩展性强

2.高效 简洁 快速

3.可移植性

4.面向对象的特性

5.强大而灵活的表达能力和不输于C的效率

6.支持硬件开发

7.程序模块间的关系更为简单,程序模块的 独立性、数据的安全性就有了良好的保障

8.通过继承与多态性,可以大大提高程序的 可重用性,使得软件的开发和维护都更为方便

 

C++缺点:

1.比较底层,易用性不是很好

2.多重继承和友元机制

3.标准库涵盖范围不足

4.开发周期长

5.非并行

6.掌握有难度

7.粒度封装不够

 

 

 

Java

Java的优点:

1.简单性

2.面向对象性(面向对象的程度可以达到 95%)

3.健壮性

4.跨平台性

5.高性能(自动垃圾回收机制)

6.多线程

7.动态性

8.安全性

 

Java的缺点:

1.效率低(毋庸置疑)

2.跨平台是它最大的优点也是最大的缺点

3.复杂性(做一个项目需要很多的知识,涉 及面广)

 

很多时候,一种语言的优点很可能是它 的缺点,缺点又可能是它的优点。这主要看 你是从哪方面去考虑。这就印证了那句话, 凡事没有必然。 不管是哪种语言,就像文章开头所言, 只要你采用他达到你想要的,那就成功了。 无需过多在意它的缺点,更无需赞扬它的优 点。所以网上那些关于哪种语言更好的口水 仗,我只能说这样的争斗毫无意义。 语言只是工具,没有好坏之分。

回来之后查了下资料才知道自己对Java、C、C++的理解并不多。于是再次把C、C++、Java的关系总结一下。

C

既具有高级语言的特点,又具有汇编语言的特点。由美国贝尔研究所的D.M.Ritchie于1972年推出。可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
C是高级语言,它把高级语言的基本结构和语句与低级语言的实用性结合起来。可以像汇编一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
C是结构式语言。结构式语言的显著特点是代码及结构的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数的形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
C语言功能齐全。具有各种各校的数据类型,并引入了指针的概念。
C语言对编写需要硬件进行操作的场合,明显优于其它高级语言。
缺点:

a)         数据封闭性不好,安全性上有很大缺陷。

b)         语法限制不太严格,对变量的类型结束不太严格,影响程序的安全性,对数组下标越界不作检查等,从应用的角度,C比其它高级语言较难掌握。

C++

         中国大陆的程序员通常读:C加加,西方程序员通常读做:C plus plus, CPP.

C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。
C子语言。C++支持C语言的几乎全部功能,主要是c89的部分,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。
面向对象的C++语言。C++语言原本不具备面向对象的设计功能,然而随着面向对象编程的概念的提出以及如Java等语言的发展成熟,C++语言也开发出了支持面向对象功能的版本。
泛型编程语言。C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。
STL(C++标准模板库,Standard Template Library)。随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的native代码低些,但是其安全性与规范性使它大受欢迎。
C++在一定程度上可以和C语言很好的结合,甚至目前大多数C语言程序是在C++的集成开发环境中完成的。C++相对众多的面向对象的语言,具有相当高的性能。   C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。
缺点:C++由于语言本身过度复杂,这甚至使人类难于理解其语义。更为糟糕的是C++的编译系统受到C++的复杂性的影响,非常难于编写,即使能够使用的编译器也存在了大量的问题,这些问题大多难于被发现。
人们一般认为,使用Java或C#的开发成本比C++低。但是,如果能够充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。造成这种差别的就是C++的软件工程性。  

 

Java与C++:

Java和C++都是面向对象语言,都能实现面向对象思想(封闭、继承、多态)。由于C++为了照顾大量C使用者,而兼容了C,使得自身仅仅成为了带类的C语言,影响了其面向对象的彻底性。Java则是完全面向对象的语言。它摒弃了其它语言的不足之处,从根本上解决了C++固有缺陷。
指针:JAVA语言让编程者无法找到指针来直接访问内存,并且增添了自动的内存管理功能,从而有效地防止了c/c++语言中指针操作失误,如野指针所造成的系统崩溃。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。
多重继承:c++支持多重继承,这是c++的一个特征,它允许多个父类派生一个子类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java不支持多重继承,但允许一个类继承多个接口(extends + implement),实现了c++多重继承的功能,又避免了c++中的多重继承实现方式带来的诸多不便。
数据类型及类 :Java是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。而c++允许将函数和变量定义为全局的。此外,Java中取消了c/c++中的结构和联合,消除了不必要的麻烦。
自动内存管理 :Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++的new操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的work方法:

Read r=new Read(); r.work();

语句Read r=new Read();在堆栈结构上建立了一个Read的实例。Java自动进行无用内存回收操作,不需要程序员进行删除。C++中必须由程序员释放内存资源,增加了程序设计者的负扔。Java中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。
操作符重载 :Java不支持操作符重载。操作符重载被认为是C++的突出特征,在Java中虽然类大体上可以实现这样的功能,但操作符重载的方便性仍然丢失了不少。Java语言不支持操作符重载是为了保持Java语言尽可能简单。
预处理功能 :Java不支持预处理功能。c/C++在编译过程中都有一个预编译阶段,即众所周知的预处理器。预处理器为开发人员提供了方便,但增加丁编译的复杂性。JAVA虚拟机没有预处理器,但它提供的引入语句(import)与C++预处理器的功能类似。
异常:JAVA中的异常机制用于捕获例外事件,增强系统容错能力。
7.  Java不支持缺省函数参数,而C++支持。在c中,代码组织在函数中,函数可以访问程序的全局变量。C++增加了类,提供了类算法,该算法是与类相连的函数,C++类方法与Java类方法十分相似,然而,由于C++仍然支持c,所以不能阻止C++开发人员使用函数,结果函数和方法混合使用使得程序比较混乱。 Java没有函数,作为一个比C++更纯的面向对象的语言,Java强迫开发人员把所有例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。

8.  字符串 :c/C++不支持字符串变量,在c和C++程序中使用Null终止符代表字符串的结束,在Java中字符串是用类对象(String和StringBuffer)来实现的,这些类对象是Java语言的核心,用类对象实现字符串有以下几个优点:

a)   在整个系统中建立字符串和访问字符串元素的方法是一致的;

b)   字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分;

c)   Java字符串执行运行时检空,可帮助排除一些运行时发生的错误;

d)   可对字符串用“十”进行连接操作。

9.  “goto语句”:“可怕”的goto语句是c和c++的“遗物”,它是该语言技术上的合法部分,引用goto语句引起了程序结构的混乱,不易理解,goto语句用于无条件转移子程序和多结构分支技术。Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使用,使程序简洁易读。

10.类型转换:在c和C++中有时出现数据类型的隐含转换,这就涉及了自动强制类转换问题。例如,在C++中可将一浮点值赋予整型变量,并去掉其尾数。Java不支持C++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。


try {

//可能产生例外的代码

} catch (exceptionType name) {

//处理

 }

其中exceptionType表示异常类型。而C++则没有如此方便的安全机制的语言。
C++相对比较复杂、健壮性弱,运行速度快,Java相对比较简单、便利。
如果从事Web和Internet行业,建议学习JAVA,

如果从事桌面系统开发或是服务开发,linux以及单片机的行业,建议学习C++。

 

 

Java与C:
C是底层的,java是包装的,java能做的C都能做。

C做的东西执行效率高但java比C的开发效率高;
Java和C都是指令式语言(Imperative Language),都是编程语言。不同的是Java是完全面向对象(OO)的语言,而C是完全面向过程的,C的高级版本C++、C#支持面向对象。
c和java都是可以跨平台的, c基于编译技术, java基于虚拟机, 两个语言跨平台的机制不同
Java跨平台,既不同的操作系统都可以通过JVM(java虚拟机)来解释Java程序,而C、C++、C#则是与平台相关的,有些指令只在某些操作系统中才能执行。具体原因是,Java是解释型语言,所有代码都会翻译成统一的、与系统无关的bytecode,然后放到JVM上运行;而C是编译式语言,代码要先通过编译器转换成与系统相关的中间代码,然后才能运行。
Java不支持系统调用,既无法与操作系统进行交互,这是由它跨平台的特点决定的,而C则可以调用系统中的指令,如fork()。这也就是为什么Java中只有线程(Thread)概念而没有进程(Process)概念,而C两者均有。
Java无法对内存进行控制,而C则可以通过指针对内存进行人为分配。还有一点,Java有Garbage Collection机制,可以自动回收不再使用的空间,而C则要用free()函数释放空间。

JAVA与C的区别

1.   Java没有预处理指令。(如C中的#define , #include , #ifdef等)。C中的常量定义在Java中用static final来取代。

2. Java中没有C中的全局变量。

3. Java中的主类型的size是确定的,而C中主类型的size跟平台相关。

4. Java中没有了指针,它使用了类似的句柄来取代指针,但是Java中不允许对句柄进行加减,没有取地址操作符之类的东东。

5. Java有垃圾收集机制,不需要自己释放空间。

6. Java没有goto语句。Java在C提供的控制语句基础上增加了异常处理和标签break和continue语句。这些可以替代goto的作用。

7. C要求一个方法或块中使用的所有局部变量的定义在该方法或块的最开始处定义,而Java允许这些定义在方法或块的任意地方出现。

8. Java不要求在调用一个函数以前已经定义了该函数,可以在调用点后面定义。而C有这个要求。

9. Java不支持C中的strut 和 union类型。Java支持方法重载。

10. Java不支持C中的enum关键字。

11. Java不支持C中的bitfields能力。

12. Java不支持C的typedef。

13. Java不支持C的方法指针。

14. Java不支持C的可变参数表。

Java与C/C++的区别

    首先应该清楚,Java是由C++发展而来的,它保留了c++的大部分内容,类似于c++,

但句法更清晰,规模更小,更易学。它是在对多种程序设计语言进行了深入细致研究的

基础上,据弃了其他语言的不足之处,从根本上解决了c++的固有缺陷,而产生的一种

新的完全面向对象的语言。

    Java和c++的相似之处多于不同之处,但两种语言问几处主要的不同使得Java更容易

学习,并且编程环境更为简单。

     因篇幅所限,这里不能完全列出不同之处,仅列出比较显著的区别:

    1.指针

    Java无指针,并且增添了自动的内存管理功能,从而有效地防

止了c/c++语言中指针操作失误,如指针悬空所造成的系统崩溃。

比w操作返回一对象的引用,类似于c++中的引用;在c++中,

new返回一个对象的指针。在Java中无指针,不会遇到下面这样的

语句:

  Mywork—>Mywork();

  没有指针的程序无法访问不属于它的内存,消除了在c++

中—些常见的错误,这有利于Java程序的安全。

    2.多重继承

    c++支持多重继承,这是c++的一个特征,它允许多父类派

生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻

烦,编译程序实现它也很不容易。Java不支持多重继承,但允许一个

类继承多个接口(界面),实现了c++多重继承的功能,又避免了c++的

许多缺陷。

  3.数据类型及类

    住Java‘fJ,使用了个能和整数湖蝴的布尔类型(bo01ean),它仪有二个值:true或false。

Java是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型(如

控型初浮点型)之外,其余的都作为类对象,包括中和数组。对象将数据(Proper山s)和方法

(meth。d)结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。而c++

允许将函数和变量定义为全局的。

    此外,Java中取消了c/c++中的结构和联合,使编译程序更简捷。

    4.自动内存管理

    Java程序中所有的对象都是用new操作符建立在堆栈上,这个操作符类似于c++的

new操作符。下面的语句由一个类Readkcy建立了一个对象,然后调用该对象的work方

法:

    配『9dLey my们rk;

    m?work=new Readkey()

    m!work.work()g

    这个简单的代码片段突出了Ja调和c十十的一些主要差别,在c十十中,语句Read—

key”ywork在堆栈结构上建立了一个Readkcy的实例。在JaM中不支持基于堆栈的对象,

所以这条语句建立了一个叫”ywork的变量,该变量中存有对象Readk。7的引用。

    Javs自动进行无用内存回收操作,不需要程序员进行删除。而c十十中必须由程序贝释

放内存资源,增加了程序设计者的负扔。Java中当一个对象不被再用到时,无用内存回收器

将给它加上标签以示删除。无用内存回收器在后台运行,利用空闲时间工作。

    5.操作符重载

    Java不支持操作符重载。操作符重载被认为是c十十的突出特征,在Java中虽然类大

体上pJ以实现这样的功能,但操作符重载的方便性仍然丢失了不少。Java语言不支持操作

符重载是为了保持Java语言尽可能简单。

  6.预处理功能

  Java允预处理器.因此不支持预处理功能。c/c十十在编译过程中都有一个预编泽阶

段,即众所周知的预处理器。预处理器为开发人员提供了方便,但增加丁编译的复杂性。JaM

没有预处理器,但它提供的引入语句(i”Port)与c十十预处理器的功能类似。

  7.  Java不支持缺省函数参数,而c十十支持。

    在c中,代码组织在函数中,函数可以访问程序的全局变量。c十十增加了类,提供了类

算法,该算法是与类相连的函数,c十十类方法与Java类方法十分相似,然而,由于c十十仍然支持c,所以不能阻止c十十开发人员使用函数,结果函数和方法混合使用使得程序比较混乱。

    Java没有函数,作为一个比c十十更纯的面向对象的语言,Java强迫开发人员把所有

例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。

8    字符串

    c和c十十不支持字符串变量,在c和c十十程序中使用Null终止符代表字符串的结

束,在Java中字符串是用类对象(strinR和stringBuffer)来实现的,这些类对象是Java语言

的核心,用类对象实现字符串有以下几个优点:

    (1)在整个系统中建立字符串和访问字符串元素的方法是一致的;

    (2)J3阳字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分;

    (3)Java字符串执行运行时检空,可帮助排除一些运行时发生的错误;

    (4)可对字符串用“十”进行连接操作。

    9“goto语句

    “可怕”的goto语句是c和c++的“遗物”,它是该语言技术上的合法部分,引用goto

语句引起了程序结构的混乱,不易理解,goto语句子要用于无条件转移子程序和多结构分

支技术。

    鉴于以广理由,Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使

用,使程序简洁易读。

    l0.类型转换

    在c和c十十中有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例

如,在c十十中可将一浮点值赋予整型变量,并去掉其尾数。Java不支持c十十中的自动强

制类型转换,如果需要,必须由程序显式进行强制类型转换。

    11.其它

    (1)break和continue后可加标号,以便跳出它标识的块。如:

inTlJ;

char a;

outing;

{for(i=:i<5;i十十)

for(j=0;j<3i j++)

{if((a=(char)system.in.read())

break outing;

}}

    2)析构函数为void finalize映(){}

Java并不保证一定调用该函数,因此不能依赖该函数来保证所写代码的正常运行。

    (3)用packa8e将有关联的类组织在一起。例如,将自己编写的类组织成packaBe;

Packa8e mycla5se55

    (4)用extaNs表示继承(派生)关系,如;

class ne订—clas5一name extends oN—class—name 47

    (5)虚函数用abstract修饰,而不用virual。

    (6)提供丁一个创建完全虚类(界面)的方法;

    Public interface intl『facenamEt//abstract mGthods)

利用界面可以为虚类定义协议,而不关心具体实施。一个类可以实现多个界面,同一个界面

也可以被多个类实现。实现界面使用imNemen贿,如:

    public classname implmen比int6rfacena毗4)

    (7)异常。用于捕获例外事件,增强系统容错能力

try{//可能产生例外的代码

}catch(exceptionType name){

//处理

其中exceptionType表示异常类型,如Arith


【Java语法与C语言的区别】

 


一、数据类型和申明

1. 标识符

Java: 可以以美元作为开头

例如:$var

2. java没有sizeof 运算符,所有数据类型的长度都是固定的,与平台无关

3. 常量定义方法

final double PI=3.14;

4. java数据类型 byte   1个字节

         short,char   2个字节

         int,float      4个字节

        long ,double   8个字节

 boolean值只有false 和true ,不能和数字互换

5.  java中新增的<<<, >>>无符号左移右移,意思是进行高位加0; 

6.  java数组的申明:

例如:int[] a1;  //或者 int a1[];

a1=new int[3];

以上两句等同于:

int a1=new int[3];

也可以直接初始化

int a1[]={1,2,3};

 


二、java中的类与c++中的类比较

1. java中的类在申明时,可以用关键字public ,private, protected修饰,作用相当于C++中在申明继承类时候的继承方式。 

2.  abstract 抽象类,抽象类(不能实例化)和抽象方法,类似于C++ virtual。

3.  java中有静态代码块,是在类中使用,不能定义在方法中,在类加载的时候执行,可以先于main()方法。

4. 有final关键字,类似于const,final修饰的类,不能被继承,修饰的成员,值不能被更改,方法不能被继承类覆盖。 

5. finalize 修饰方法,类似于c++析构函数。 

6.父类与子类对象之间的关系,一个父类对象可以指向多种子类,运行时自动选择正确的方法进行调用,叫动态绑定。注意,当把父类对象指向了子类,调用子类的方法时,就会出现错误。C++中,通过指向对象的指针可实现这种多态的功能。

7. super关键字直接父类的对象。例如在创建子类对象时,子类的构造函数中,需要给父类的私有成员数据赋值,则可以通过super(),即调用父类的构造函数来实现。C++中无。

8. java中多重继承是通过接口实现的,类只能实现单一继承。接口中的方法都是抽象方法,没有具体实现。

接口的访问控制符,只有public一个,表示可以被所有的类和接口使用,如果没有此修饰符,只能被同一个包中的其他类和接口使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: