C、C++、C#、JAVA的区别与联系
C是⼀个结构化语⾔,如谭⽼爷⼦所说:它的重点在于算法和数据结构。C程序的设计⾸要考虑的是如何通过⼀个过程,对输⼊(或环境条件)进⾏运算处理得到输出(或实现过程(事务)控制),⽽对于C++,⾸要考虑的是如何构造⼀个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
所以C与C++的最⼤区别在于它们的⽤于解决问题的思想⽅法不⼀样。之所以说C++⽐C更先进,是因为“ 设计这个概念已经被融⼊到C++之中 ”,⽽就语⾔本⾝⽽⾔,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,⼀样不⾏。⽽且,“C加上好的设计”也能写出⾮常好的东西。
对语⾔本⾝⽽⾔,C是C++的⼦集,那么是什么样的⼀个⼦集?从上⽂可以看出, C实现了C++中过程化控制及其它相关功能,⽽在C++中的C(我称它为“C+”),相对于原来的C还有所加强,引⼊了重载、内联函数、异常处理等等内容,C++更是拓展了⾯向对象设计的内容,如类、继承、虚函数、模板和包容器类等等。
C语⾔是⼀种结构化编程语⾔。它层次清晰,便于按模块化⽅式组织程序,易于调试和维护。C语⾔的表现能⼒和处理能⼒极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还
可以直接访问内存的物理地址,进⾏位(bit)⼀级的操作。由于C语⾔实现了对硬件的编程操作,因此C语⾔集⾼级语⾔和低级语⾔的功能于⼀体。既可⽤于系统软件的开发,也适合于应⽤软件的开发。此外,C语⾔还具有效率⾼,可移植性强等特点。因此⼴泛地移植到了各类各型计算机上,从⽽形成了多种版本的C语⾔。
C++ 是在C的基础上改进后的⼀种编程语⾔,主要是增添了许多新的功能,难度也⽐C⼤,和C⼀样侧重于计算机底层操作,也就是系统软件的开发。 C#是在C++的基础上再⼀次改进后的编程语⾔,相⽐C++⽽⾔难度有所减⼩(微软是这么说的),侧重于⽹络和数据库编程。
C 语⾔与 C++ 的区别有很多:
1,全新的程序程序思维,C 语⾔是⾯向过程的,⽽ C++ 是⾯向对象的。
2,C 语⾔有标准的函数库,它们松散的,只是把功能相同的函数放在⼀个头⽂件中;⽽ C++ 对于⼤多数的函数都是有集成的很紧密,特别是 C 语⾔中没有的 C++ 中的 API 是对 Window 系统的⼤多数 API 有机的组合,是⼀个集体。但你也可能单独调⽤ API。
3,特别是 C++ 中的图形处理,它和语⾔的图形有很⼤的区别。C 语⾔中的图形处理函数基本上是不能⽤在中 C++ 中的。C 语⾔标准中不包括图形处理。
4,C 和 C++ 中都有结构的概念,但是在 C 语⾔中结构只有成员变量,⽽没成员⽅法,⽽在 C++ 中结构中,它可以有⾃⼰的成员变量和成员函数。但是在 C 语⾔中结构的成员是公共的,什么想访问它的都可以访问;⽽在 VC++ 中它没有加限定符的为私有的。
4,C 语⾔可以写很多⽅⾯的程序,但是 C++ 可以写得更多更好,C++ 可以写基于DOSr程序,写 DLL,写控件,写系统。5,C 语⾔对程序的⽂件的组织是松散的,⼏乎是全要程序处理;⽽ C++ 对⽂件的组织是以⼯程,各⽂件分类明确。
6,C++ 中的 IDE 很智能,和 VB ⼀样,有的功能可能⽐VB还强。
7,C++ 对可以⾃动⽣成你想要的程序结构使你可以省了很多时间。有很多可⽤的⼯具如加⼊ MFC 中的类的时候,加⼊变量的时候等等。
8,C++ 中的附加⼯具也有很多,可以进⾏系统的分析,可以查看 API;可以查看控件。
9,调试功能强⼤,并且⽅法多样。
1. C++虽然主要是以C的基础发展起来的⼀门新语⾔,但她不是C的替代品,不是C的升级,C++和C是兄弟关系。没有谁⽐谁先进的说法,更重要的⼀点是C和C++各⾃的标准委员会是独⽴的,最新的C++标准是C++98,最新的C标准是C99。因此也没有先学C再说C++的说法,也不再(注意这个"不再
")有C++语法是C语法的超集的说法。
2. C++/CLI 和 C# 是微软的,它们与C和C++没有任何关系,虽然部分语法相似。但哪两种语⾔不相似呢?都是abc这26个字母。
3. 不要使⽤TC/TC++/BC/CB等古⽼的编译器来学习C/C++,因为它们太古⽼了,不⽀持新的C/C++标准。不要使⽤CBX/VC++6.0/VC2005等对C/C++标准⽀持不好的编译器,虽然这些编译器适合⼯作,但不适合学习,因为它们中的语法陷阱很多。记住唯⼀适合学习的编译器是gcc/mingw。[antigloss注:Dev-C++ 使⽤的编译器就是gcc & g++]
4. 不要⽤""代替<>来包含系统头⽂件,虽然有些编译器允许你这样做,但它不符合C/C++标准。
错误的⽰例:#include "stdio.h",#include "iostream"。[antigloss注:习惯上,<> ⽤于包含标准头⽂件和系统头⽂件,"" ⽤于包含⾃定义头⽂件。标准似乎没有明确规定不准⽤ "" 包含标准头⽂件和系统头⽂件。使⽤ "" 包含标准头⽂件或者系统头⽂件只能说是⼀种不良风格。] 5. 不要将main函数的返回类型定义为void,虽然有些编译器允许你这样做,但它不符合C/C++标准。不要将函数的int返回类型省略不写,在C++中要求编译器⾄少给⼀个警告。错误的⽰例:void main() {},main() {} [antigloss注:C99和C++98都要求编译器对省略int⾄少发出⼀个警告]
如果不需要从命令⾏中获取参数,请⽤int main(void) ;否则请⽤int main( int argc, char *argv[] ) 。
6. 不要把VC++中的 #include "stdafx.h" 贴出来,它是预编译头⽂件。如同上菜时不要把厨师也放到托盘中。
7. [C++]不要#include <iostream.h>,不要#include <string.h>,因为它们已经被C++标准明确的废弃了,请改为 #include <iostream> 和
#include <cstring>。规则就是:
a. 如果这个头⽂件是旧C++特有的,那么去掉.h后缀,并放⼊std名字空间,
⽐如 iostream.h 变为 iostream。
b. 如果这个头⽂件是C也有的,那么去掉.h后缀,增加⼀个c前缀,⽐如 string.h
变为 cstring;stdio.h 变为 cstdio, 等等。
BTW:不要把string、cstring、string.h三个头⽂件搞混淆
BTW:windows.h不是C/C++的标准⽂件,因此它的命名C/C++不管。
8. 不要再写 char* p = "XXX" 这种语句,要写成 const char* p = "XXX",编译器之所以让前者通过编译
是为了兼容以前的⼤量的旧代码。[antigloss 注:这段话对 C++ ⽽⾔是正确的。但是,⽬前的 C99 标准似乎并没有定义 "XXX" ⼀定是常量。]
BTW:const TYPE* p 和 TYPE const* p 是⼀样的,风格不同⽽已。
BTW:C语⾔中也有const关键字。
9. 不要在同⼀条语句中包含⼀个变量的多个++/--,因为它们的解析在C/C++标准中没有规定,完全取决于编译器的个⼈⾏为。
10. C/C++ 是平台⽆关性语⾔,因此系统相关的 process/GUI 等不在标准 C/C++ 库中。⽐如 graphics.h 和 windows.h 等是由某个编译器提供的,⽽不是由C/C++ 提供的。
11. C/C++只是语⾔,⽽且是平台⽆关性语⾔。论坛上有部分⼈甚⾄认为C就是dos,C++就是windows,那么请问linux是什么?
12.[C++]⾯向对象曾经是设计C with class(C++的前⾝)的主要⽬的,但C++不是,C++是⼀个多典范语⾔。主要⽀持过程调⽤、基于对象、⾯向对象、泛式编程这四种编程典范。当然还⽀持functional, generative,metaprogramming等典范。
13. 语法学家不是⽂学家,所以当你学会了⼀门计算机语⾔时,你还需要学习数据机构和算法,还需要掌握⼯具和平台API的⽤法。
14. C/C++ 是通⽤语⾔,因此语法很复杂,你应当裁减成适合你⾃⼰的语法集合,⽐如裁减成 better C 和 ADT。
15. C/C++是通⽤语⾔,因此只含通⽤的库,你应该丰富⾃⼰需要的库,⽐如汽车⼯业协会有⾃⼰的C/C++函数/类/模板库。
强制转换 malloc() 的返回值
⾸先要说的是,使⽤ malloc 函数,请包含 stdlib.h(C++ 中是 cstdlib),⽽不是 malloc.h 。因为 malloc.h 从来没有在 C 或者 C++ 标准中出现过!因此并⾮所有编译器都有 malloc.h 这个头⽂件。但是所有的 C 编译器都应该有 stdlib.h 这个头⽂件。
在 C++ 中,强制转换 malloc() 的返回值是必须的,否则不能通过编译。但是在 C 中,这种强制转换却是多余的,并且不利于代码维护。起初,C 没有 void 指针,那时 char* 被⽤来作为泛型指针(generic pointer),所以那时 malloc 的返回值是 char* 。因此,那时必须强制转换 malloc 的返回值。后来,ANSI C(即C89)标准定义了void 指针作为新的泛型指针。void 指针可以不经转换,直接
赋值给任何类型的指针(函数指针除外)。从此,malloc 的返回值变成了 void* ,再也不需要强制转换 malloc 的返回值了。以下程序在 VC6 编译⽆误通过。        #include <stdlib.h>
int main( void )
{
double *p = malloc( sizeof *p ); /* 不推荐⽤ sizeof( double ) */
free(p);
return 0;
}
当然,强制转换malloc的返回值并没有错,但画蛇添⾜!例如,⽇后你有可能把double *p改成int *p。这时,你就要把所有相关的 (double *) malloc (sizeof(double))改成(int *)malloc(sizeof(int))。如果改漏了,那么你的程序就存在 bug 。就算你有把握把所有相关的语句都改掉,但这种⽆聊乏味的⼯作你不会喜欢吧!不使⽤强制转换可以避免这样的问题,⽽且书写简便,何乐⽽不为呢?使⽤以下代码,⽆论以后指针改成什么类型,都不⽤作任何修改。
double *p = malloc( sizeof *p );
类似地,使⽤ calloc ,realloc 等返回值为 void* 的函数时,也不需要强制转换返回值。
C# 与 C++ ⽐较的话,最重要的特性就是 C# 是⼀种完全⾯向对象的语⾔,⽽ C++ 不是,另外 C# 是基于 IL 中间语⾔和
.NET Framework CLR 的,在可移植性,可维护性和强壮性都⽐ C++ 有很⼤的改进
C# 的设计⽬标是⽤来开发快速稳定可扩展的应⽤程序,当然也可以通过 Interop 和 Pinvoke 完成⼀些底层操作,但是对于⼀些和底层系统相关很紧密的程序(譬如说驱动程序),还是建议⽤ C++ 来写
C++ 不允许在⼀个构造函数中调⽤另外⼀个构造函数(称为委派构造函数调⽤),⽽ C# 则允许。委派构造函数调⽤语法上⾮常⾃然和易懂,事实上, C++ 不提供这⼀特性并不是出于语法上的考虑,⽽是出于资源管理的考虑(这样的事情对 C++来说还有很多很多)。
C++ 的构造函数⽤于分配资源,⽽析构函数⽤于释放资源,构造函数和析构函数调⽤必须匹配,否则就打破了 C++ 的基本规则。如果允许委派构造函数调⽤,则显然会打破这⼀规则——构造函数被执⾏两次,⽽析构函数只执⾏⼀次。当然,对⼀些类,例如前⾯的那个 Point 来说这不是个问题,但是从语⾔机制的⾓度讲这个特性可能属于“危险”的特性。注:在最新的C++ 标准提议草案中,Herb 等⼈有
⼀个关于允许委派构造函数调⽤的提案,当然这很⼤程度上是为了⽅便 C++ /CLI 绑定。
在 C++ 构造函数中,虚函数调⽤会被编译器⾃动转为普通函数调⽤,⽽在 C# 构造函数中允许进⾏虚函数调⽤。 C++ 这样处理⾃然有它的原因——在 C++ 中,构造函数执⾏完成后对象才初始化好,对于多态对象来说,也就意味着构造函数在背后执⾏了很重要的⼀件事情——初始化对象的虚函数表。
如果我们在基类的构造函数中调⽤了虚函数,则因为此时对象的虚函数表仍旧是基类的虚函数表,所以⽆法进⾏正确的虚函数调⽤。
也就是这个原因,通常我们应该避免在构造函数中调⽤虚函数,因为它违背了虚函数的语义。
⽽在 C# 中,在对象的构造函数执⾏之前对象的类型信息就已经初始化好了,所以可以进⾏正常的虚函数调⽤。
C#跟C/C++根本不是⼀个等级上的语⾔,C#是微软专门为平台定制的语⾔,是⼀种虚拟机语⾔(因此和本机代码的
C/C++/D有本质区别),是Java的竞争者。C++是⼀种开放语⾔标准,全世界各组织和企业有⼴泛实现和变种,相⽐之
下,C#离不开平台,⽽离不开windows(这点⽐不上Java),⽽windows离不开微软的⽀持(这点⽐不上Linux这种开源操作系统)。
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。c语言和c++区别
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)ad())

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。