C是一门面向过程的语言,C++是在C基础上发展的一门面向对象的语言,其语法特性留存有面向过程的痕迹,而Java则是一门为面向对象而生的语言,所有的功能实现思路都从对象的角度出发。本分主要列举了部分C/C++和Java之间一些语法和特性的不同。

1. 基本数据类型

Java提供8种基本数据类型。byte(1字节)、short(2字节)、int(4字节)、long(8字节)、float(4字节)、double(8字节)、boolean、char(2字节)。Java变量使用前必须初始化,未初始化无法通过编译。

C语言基本数据类型分为整数类型、浮点数类型,C++还包括了布尔类型。C编译器不会检查变量有没有初始化,未经初始化而使用的变量将会得到一个随机值(原本内存空间的值)。

  • 整数类型:char(1字节)、unsigned char(2字节)、signed char(1字节)、int(2或4字节)、unsigned int(2或4字节)、short(2字节)、unsigned short(2字节)、long(4字节)、unsigned long(4字节)
  • 浮点数类型:float(4字节)、double(8字节)、long double(16字节)
  • 布尔类型:bool(1字节)

区别

在不同的平台,C所提供的数据类型的空间占用大小是不同的(在16位的机器上,int只占2个字节),而Java则在不同平台上表现一致性。C提供了unsigned类型(不能表示负数),可以提高存储数字的效率,但是一般情况下不建议使用,除非是在非常注重效率的场景。c提供的char的实现取决于编译器的实现,VC编译器、x86上的GCC都把char定义为signed char,而arm-linux-gcc却把char定义为 unsigned char,ASCII标准里定义的字符都是0~127,所以三种char类型都能存储得下。

2. 变量初始化

c和java的变量申明(初始化)类似,采用TYPENAME VARIABLENAME [ = INITIALVALUE];的形式。C不会检查变量有没有被初始化,如果使用一个未被初始化的变量,那么得到的是随机的结果(取决于程序使用的内存所存储的值)。

1
2
3
4
int main(){
int a;
printf("%d", a);
} //C中能够通过编译并执行,java不能通过编译

3. 数组

Java中会检查数组使用是否越界,而C/C++并不会对任何越界行为进行检查,越界访问的数据将会是一个随机的值。

4. String

C中的string是用char数组表示的,C++提供了string类,用法与java相似。

C中可以直接使用>,>=,==,<=,<等不等关系运算符来比较字符串,而java需要用compare方法和equals方法,java中使用==比较的是内存地址,而不是实际的string值。其实可以看出,java是纯面向对象的思想。

5. 对象

1
Person person;

C++中,如上的代码真正调用默认无参构造函数构造了一个对象,可以正常使用person对象,而Java中只是生成了一个Person类型的引用,使用person会产生NullPointerError。

p1和p2都是Person类型的引用,代码p1 = p2在java中表示s的是p1和p2引用的是同一个对象,而C++则是用p2代表的对象新生成了一个p1对象,可以理解为java中调用了p2的clone函数。

6. 函数

Java的所有函数都必须属于一个类,而C/C++中的函数可以不属于任何一个类,这些函数可以理解为全局函数。

JAVA中函数参数的传递分为两种,一种基本变量(int,double,String)是值传递,被调函数不会影响主调函数,另一种是对象传递,对象传递都是通过引用进行,被调函数对对象的修改会影响主调函数(因为实际是同一个对象)。

C++中的函数参数默认情况下参数只是原对象的一个副本,被调函数的任何修改都不会影响主调函数,在通过&或*获取获取对象引用或地址并用引用或指针接收的情况下,被调函数中操作的对象与主调函数一直,类似于Java中的引用传递。C++可以通过如下方式交换主调函数中两个int型变量的值,而这在java中不可能做到(基本变量属于值传递)。

1
2
3
4
5
void swap(int* i, int* j) {
int tmp = *i;
*i = *j;
*j = tmp;
}

7. 内存管理

C/C++中的内存由程序员管理,操作不当可能导致内存泄露或野指针。而Java中的内存管理有JVM运行,一个变量一旦不需要,只需要让其置空,JVM会通过垃圾回收线程处理。

1
2
3
4
5
//C/C++
malloc、calloc、realloc分配内存,free释放后将指针置为NULL;
new分配内存,通过delete或delete []释放内存后将指针置为NULL
//Java
直接将变量置为null;