1. 程式人生 > >C 與 JAVA 的對比分析

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 _Complex extern _Imaginary inline register
restrict signed sizeof struct typedef union Usigned

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中通常用標頭檔案來宣告原型以及全域性變數、庫函式等。