C 与 JAVA 的对比分析

 Sun 公司推出的Java 是面向对象程序设计语言,其适用于Internet 应用的开发,称为网络时代重要的语言之一。Java 可以用认为是C 的衍生语言,与C 在大量元以内成分保持相同,例如此法结构、表达式语句、运算符等与C基本一致:但Java更简洁,没有C中冗余以及容易引起异常的功能成分,并且增加了多线程、异常处理、网络编程等方面的支持功能。本文从多角度对Java与C进行对比分析,为C与Java语言的学习提高一些借鉴。

 

1、调法结构

       C与Java的词法结构很相似,针对程序中的空白符、标识符、注释、常量、运算符、分隔符和关键字等进行详细对比分析。

1.1、空白符和注释

        空白符包括空格、制表符和换行符。

C中存在两种注释:

1)注释语句以/*开头,以*/结束。

2)注释可以用//开始,延伸到下一个行终结符。

Java包含了C的两种注释和空白符。


1.2、标识符

C的标识符集合是Java 的标识符集合的一个子集。C中标识符由大小写拉丁字符、数字和下划线组成的,且不能以数字开头,不能与关键字相同;

Java的标识符由大小写拉丁字符、数字、下划线以及$组成,也不能以数字开头;


1.3、关键字和保留标识符

         关键字是语言的特殊符号,C和Java的关键字较相似。

有些关键字Java中独有的,如下图所示:

abstract

assert

boolean

byte

catch

class

extends

Final

finally

implements

import

instranceof

interface

native

New

package

private

protected

public

strictfp

super

synchronized

this

throw

throws

transient

try

 

有些关键字在C中使用而Java未使用,下表所示为C中独有的关键字。

Auto_bool_Complexextern_Imaginaryinlineregister
restrictsignedsizeofstructtypedefunionUsigned


1.4、常量

          常量包括4中类型:整形、浮点型、字符型和字符串型。对于常量,C与Java存在细微的差别。

1) C中整型常数中只有无符号整型常数比Java的整型常数大,Java中没有后缀long long型和unsigned;

2) C 和 Java 的字符常量和字符串常量很接近,C中有续行机制,即如果字符串太长,一行放不下,则可以在行末加上一个反斜杠,反斜杠和行终结符被忽略,使字符串常量可以写在多行中,并且所有的源行都可以续航。但Java 中,不允许字符串跨越多行。

3) C中每个字符串都是由空字符("\0")来结尾,而Java 的字符串中没有如此的终结符。

4) 在C中,"0"还可以表示布尔值假(false)或指针空(NULL),在Java采用保留标识符false 或 NULL。


1.5、运算符和分隔符

      Java 中大多数运算符和分隔符与C是兼容的,C中提供的运算符几乎完全适合于Java语言。两者的细微差别是:

1)C中独有间接成员运算符(->)、取值运算符(*)、地址运算符(&)、逗号运算符(,);

2)Java 不提供指针运算符,增加了对象操作符 instanceof、字符串运算符+和零填充的右移》等;

3)与C不同的是,Java中算数运算符不能用在布尔类型上,逻辑运算符的操作数只能是布尔型而不能是整型,在转换中需要进行特殊处理;

4)C中利用 sizeof 进行数据分配和释放内存以及获取的数据的个数,但在java中没有此运算符,因为所有的数据类型在所有机器中的大小都是相同的;


2、数据类型

      C中数据类型分为:算书类型、指针类型、数组类型、结构类型、联合类型、枚举类型、函数类型和void类型,以下对上述类型在Java与C的异同以及类型转异换进行比较分析。

2.1、算术类型

         C中算术类型包括整型和浮点型。C中的整型有字符类型、布尔类型和枚举类型。C中类型大小依赖于C编译器的具体实现;

         Java对基本数据类型大小有明确约定,其中char 是一个2字节的无符号整数,用来存储Unicode字符。除char类型外,Java不支持无符号整型,其它整型都是无符号的;

并且C中char类型的用法比Java中灵活。C中char类型的数组和指针可以用来表示字符串,而Java须使用string类表示。


2.2、结构和联合类型

         Java中没有结构类型;在C中声明结构变量时编译器会为其分配内存空间,而在Java中需要用new来分配空间;C中允许不完整初始化以及声明匿名结构(可嵌套),在Java中确实不被允许的;Java中没有与C中对应的联合类型这种语言结构。


2.3、枚举类型

          C中,枚举类型声明代表整数常量的符号名称,枚举常量事实上是int 类型;

          Java 中,存在枚举类型,关键字enum 声明的枚举变量事实上是java.lang.Enum 的一个子类,可以为其添加属性和方法,虽然其中的枚举常量也是int 类型,但不能用整数初始化,也不能作为整型使用。


2.4、void类型

          C 和 Java 都支持 void 类型。

          C 中void 可代替函数参数表以及表示函数不带参数,在建立 void * 类型时,void * 类型的变量可以存储一个指向任意类型或函数的指针;

          Java 中的 void 仅表示方法没有返回值。


2.5、typedef

          C 中 typedef 不是预处理指令,而是为某一类型创建另外名字的,并且C允许在一个typedef 中引用另一个 typedef 定义的名字;

          Java 中没有与之对应的机制;


2.6、数据类型转换

          Java 语言属于强类型语言,对数据类型兼容性要求比C更严格,这保障了他的安全性和健壮性。Java中所有的数值传递,无论是直接还是通过参数传递的都先要进行类型兼容性的检查,任何类型的不匹配的都会产生编译错误。在Java 中,整数类型、浮点数类型和字符类型是彼此兼容的,但和布尔类型是不兼容的,除了布尔型和枚举类型,Java中允许吧任何基本类型转换成别的基本类型;

          C中表示真/假的变量一直是由int 类型来表示的。C允许从算术类型转换为布尔类型。Java 不允许在这两种类型之间进行隐式和显式的转换,也不能比较布尔型和算术型。


3、表达式和语句

         Java的表达式和语句与C的几近一致,存在一些细微差别:在Java 中 if、write、for 语句中的条件表达式应该是布尔型,在C中可以是整形;Java 不提供goto语句,goto语句的存在可以改变程序的运行方式,是程序的安全性和稳定性降低,Java利用代表号的break 语句和continue语句实现转移功能;表达式语句在Java中比C有更多的限制,Java中只允许复制、函数调用、自增减、new 表达式等出现在表达式语句中。


4、函数

1)对于变量和函数,C需要实现声明和定义,而Java中只有定义,没有声明;

2)由于C不是面向对象的,所以C中所有全局变量和函数本质上对Java而言都是静态的。Java是一种面向对象语言,它不允许在类和接口之外声明函数,包括 main 函数和变量。而在C中,常会出现在一个文件中定义大量的全局变量,在其他文件中通过引用声明这些变量来实现共享,但Java不允许有全局变量或函数;

3)当C中函数返回值的类型和声明时类型不相符时,函数的返回值会自动转换为这个类型之后再进行函数返回;而在Java中面对次情况时,需要加入强制类型转换;

4)C中函数调用参数计算的顺序是未定义的,而Java 是从左到右有顺序的;

5)C中如果变量或函数在别的文件中定义的,必须使用extern 来声明该变量或函数。在单个文件编译的时候它们是不可见,而在链接阶段才可见。Java的编译器没有这种链接阶段,所有需要的文件在编译时必须可见;

6)C和Java程序都从 main 函数开始执行。C中main 函数一般需要有 argc,argv 两个参数,argc 存在命令行参数个数,argv 存在实际的命令行参数;java 中main 必须用 stringargs[] 作为方法的参数,它是用来接收运行系统启动Java 应用程序时所用的命令行的参数;

7)C和Java中可以调用 exit 函数来终结程序;C中可利用abort 函数来退出非正常终止的程序,Java 中没有相对应的策略。


5、数组

1)数组是同一类型的数据元素的有序序列。Java 程序在编译和运行时严格地检查所有数组的边界,提高了程序的安全性;在C中并没有提供边界检查功能,如此可以提供程序的运行速度;

2)在C中,数组一般是在定义时就指定其大小,由编译器分配数组所需的一块连续的内存空间,而且数组中的元素是按顺序存储的;在Java 中,数组定义时不被允许指定数组的大小,同时也不会为其分配内存空间,需要用new 运算符显示创建,或者通过初始化方法隐式创建,数组所占用的空间由Java的来及收集器自动地回收;

3)C 中如果部分初始化数组,未促使花的元素则被设置为0。Java并不直接支持多维数组,但可以创建数组的数组,用这种方法可以实现多维数组;

4)值得注意的是,在C中数组实际得到的是它的指针,而在Java中得到的是引用,不是指针。在Java中程序只能通过下标运算符和访问数组元素,不能像C中的指针那样通过整数加减运算来访问元素;

5)C允许数组的牵引类型可以为long型,而Java 的要求是 int 型。


6、预处理器及头文件的比较

       Java没有预处理器,也没有头文件;C中预处理器只是接收一些文本并将其转换成为其他文本,编译器对预处理的源程序进行编译,在C中通常用头文件来声明原型以及全局变量、库函数等。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红帽集群RHCS

1、简介:RHCS是RedHatClusterSuite的缩写,也就是红帽子集群套件,RHCS是一个能够提供高可用性、高可靠性、负载均衡、存储共享且经济廉价的集群工具集合,它将集群系统中三大集群架构融合一体,可以给web应用、数据库应用…

Java 基础——类的加载

当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三个步骤来对该类进行初始化,JVM将会连续完成这三个步骤,也把这三个步骤统称为类加载或类初始化; 类加载指的是…

HDUOJ-----1556Color the ball

Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6787 Accepted Submission(s): 3549 Problem DescriptionN 个气球排成一排&#xff0c;从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <…

Java 基础——数组解析

数组对于每一门编辑应语言来说都是重要的数据结构之一&#xff0c;当然不同语言对数组的实现及处理也不尽相同。 Java语言中提供的数组是用来存储固定大小的同类型元素。 可以声明一个数组变量&#xff0c;如numbers[100]来代替直接声明100个独立变量number0&#xff0c;number…

《在你身边,为你设计》-哪位知道下载、在线阅读地址啊?

《在你身边&#xff0c;为你设计》-前端UI必读出自腾讯CDChttp://cdc.tencent.com/?p6761今天听同事说这本书写的非常好&#xff0c;改变了他关于前端UI的许多看法&#xff0c;可谓&#xff1a;醍醐灌顶。可惜我网上找了下都需要Money买&#xff0c;哪位有在线阅读、PDF下载地…

Java 基础——类和对象

Java作为一种面向对象语言。支持以下基本概念&#xff1a; •多态 •继承 •封装 •抽象 •类 •对象 •实例 •方法 •消息解析 本节我们重点研究类与对象的概念。 对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c…

报告显示Q2 Android平板电脑全球市场份额达67%

网易科技讯 7月30日消息&#xff0c;据国外媒体报道&#xff0c;市场调研公司Strategy Analytics最新公布的报告显示&#xff0c;2013年第二季度平板电脑全球出货量达到5170万台&#xff0c;比去年同期的3610万台增长43&#xff05;&#xff0c;其中Android、iOS和Windows平板电…

活期储蓄账目管理系统

基本要求&#xff1a;实现储户开户、销户、存入、支出等活动。要求能查找储户的账户&#xff0c;实现存款、取款、插入、删除等操作。具体功能如下&#xff1a;&#xff08;1&#xff09;实现储户开户。&#xff08;2&#xff09;实现储户销户。&#xff08;3&#xff09;向某账…

面向过程 VS 面向对象

面向过程&#xff08;Process Oriented&#xff09;这个词是在面向对象&#xff08;Object Oriented&#xff09;出现之后为与之相对而提出的。其实它在以前基本被叫做“结构化编程”。 早期的程序设计&#xff0c;大量使用共享变量&#xff08;全局变量&#xff09;和GOTO语句…

一、OpenStack架构

DashBoardHorizon提供WEB界面ComputerNova计算也就是虚拟机NetworkingNeutron提供给nova网络支持Object StorageSwift提供对象存储Block StorageCinder提供云硬盘给nova&#xff0c;同时备份到SwiftIdentity SserviceKeystone提供所有组件的认证Image ServiceGlance提供给nova镜…

Java 三大特性 —— 多态

Java中多态性的实现 一、什么是多态 1.面向对象的三大特性&#xff1a;封装、继承、多态。从一定角度来看&#xff0c;封装和继承几乎都是为多态而准备的。这是我们最后一个概念&#xff0c;也是最重要的知识点。 2.多态的定义&#xff1a;指允许不同类的对象对同一消息做出响应…

linux /proc/cpuinfo文件分析

为什么80%的码农都做不了架构师&#xff1f;>>> 基于不同指令集&#xff08;ISA&#xff09;的CPU产生的/proc/cpuinfo文件不一样&#xff0c;基于X86指令集CPU的/proc/cpuinfo文件包含如下内容&#xff1a; processor  &#xff1a; 0vendor_id  &#xff1a;…

Java 高级类(下) —— 内部类和匿名类

Java内部类&#xff08;Inner Class&#xff09;&#xff0c;类似的概念在C里也有&#xff0c;那就是嵌套类&#xff08;Nested Class&#xff09;&#xff0c;乍看上去内部类似乎有些多余&#xff0c;它的用处对于初学者来说可能并不是那么显著&#xff0c;但是随着对它的深入…

wcf会话、实例化、并发

在asp.net中含有会话&#xff0c;是保存值&#xff0c;供所有的程序使用&#xff0c;同样在wcf中也有会话&#xff0c;供多个客户端使用。 会话的支持通常在契约定义的开始标出&#xff0c;如下 [ServiceContract(Namespace "http://Microsoft.ServiceModel.Samples"…

Java 高级类(上) —— 抽象类和接口

在面向对象的概念中&#xff0c;我们知道所有的对象都是通过类来描绘的&#xff0c;但是并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 抽象类往往用来表征我们在对问题领域进行分析、 设…

【Git入门之五】版本管理

2019独角兽企业重金招聘Python工程师标准>>> 1.版本回退 我们先看一下从项目开始到现在做了什么操作。 [cpp] view plaincopy #总共是4个操作 $ git log --prettyoneline c5c83cfcdb25c67a5c66b4fe3844d0ea912830ec remove JackyData03 a25c58804cb3f4045564fc0e…

Java 进阶——单例模式

一、单例模式概念及特点 Java中单例模式是一种常见的设计模式&#xff0c;单例模式分三种&#xff1a;懒汉式单例、饿汉式单例、登记式单例三种。 单例模式有一下特点&#xff1a; 1、单例类只能有一个实例。 2、单例类必须自己自己创建自己的唯一实例。 3、单例类必须给所有其…

异步网络消息处理框架

最近一段时间将原来写的kendynet网络框架重写了大部分的代码&#xff0c;让提供的接口更清晰&#xff0c;对用户更友好。 整个框架的架构分层3层&#xff1a; 1)单线程,基于原始数据流的网络接口,在这一层上&#xff0c;没有提供封包的处理&#xff0c;定时器事件等等。使用者可…

Java 关键字—— static 与 final

static表示“全局”或者“静态”的意思&#xff0c;用来修饰成员变量和成员方法&#xff0c;也可以形成静态static代码块&#xff0c;但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说&#xff0c;它不依赖类特定的实例&am…

Linux 小记录

<1>bzero 原型&#xff1a;extern void bzero(void *s, int n);用法&#xff1a;#include <string.h> 功能&#xff1a;置字节字符串s的前n个字节为零。 说明&#xff1a;bzero无返回值。 LINUX平台支持bzero的&#xff0c;但是其并不在ANSI C中定义&…