C 与 JAVA 的对比分析
?Sun 公司推出的Java?是面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,其適用于Internet 應(yīng)用的開(kāi)發(fā),稱為網(wǎng)絡(luò)時(shí)代重要的語(yǔ)言之一。Java 可以用認(rèn)為是C 的衍生語(yǔ)言,與C 在大量元以內(nèi)成分保持相同,例如此法結(jié)構(gòu)、表達(dá)式語(yǔ)句、運(yùn)算符等與C基本一致:但Java更簡(jiǎn)潔,沒(méi)有C中冗余以及容易引起異常的功能成分,并且增加了多線程、異常處理、網(wǎng)絡(luò)編程等方面的支持功能。本文從多角度對(duì)Java與C進(jìn)行對(duì)比分析,為C與Java語(yǔ)言的學(xué)習(xí)提高一些借鑒。
?
1、調(diào)法結(jié)構(gòu)
?????? C與Java的詞法結(jié)構(gòu)很相似,針對(duì)程序中的空白符、標(biāo)識(shí)符、注釋、常量、運(yùn)算符、分隔符和關(guān)鍵字等進(jìn)行詳細(xì)對(duì)比分析。
1.1、空白符和注釋
??????? 空白符包括空格、制表符和換行符。
C中存在兩種注釋:
1)注釋語(yǔ)句以/*開(kāi)頭,以*/結(jié)束。
2)注釋可以用//開(kāi)始,延伸到下一個(gè)行終結(jié)符。
Java包含了C的兩種注釋和空白符。
1.2、標(biāo)識(shí)符
C的標(biāo)識(shí)符集合是Java 的標(biāo)識(shí)符集合的一個(gè)子集。C中標(biāo)識(shí)符由大小寫拉丁字符、數(shù)字和下劃線組成的,且不能以數(shù)字開(kāi)頭,不能與關(guān)鍵字相同;
Java的標(biāo)識(shí)符由大小寫拉丁字符、數(shù)字、下劃線以及$組成,也不能以數(shù)字開(kāi)頭;
1.3、關(guān)鍵字和保留標(biāo)識(shí)符
???????? 關(guān)鍵字是語(yǔ)言的特殊符號(hào),C和Java的關(guān)鍵字較相似。
有些關(guān)鍵字Java中獨(dú)有的,如下圖所示:
| 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 | ? |
有些關(guān)鍵字在C中使用而Java未使用,下表所示為C中獨(dú)有的關(guān)鍵字。
| Auto | _bool | _Complex | extern | _Imaginary | inline | register |
| restrict | signed | sizeof | struct | typedef | union | Usigned |
1.4、常量
????????? 常量包括4中類型:整形、浮點(diǎn)型、字符型和字符串型。對(duì)于常量,C與Java存在細(xì)微的差別。
1) C中整型常數(shù)中只有無(wú)符號(hào)整型常數(shù)比Java的整型常數(shù)大,Java中沒(méi)有后綴long long型和unsigned;
2) C 和 Java 的字符常量和字符串常量很接近,C中有續(xù)行機(jī)制,即如果字符串太長(zhǎng),一行放不下,則可以在行末加上一個(gè)反斜杠,反斜杠和行終結(jié)符被忽略,使字符串常量可以寫在多行中,并且所有的源行都可以續(xù)航。但Java 中,不允許字符串跨越多行。
3) C中每個(gè)字符串都是由空字符("\0")來(lái)結(jié)尾,而Java 的字符串中沒(méi)有如此的終結(jié)符。
4) 在C中,"0"還可以表示布爾值假(false)或指針空(NULL),在Java采用保留標(biāo)識(shí)符false 或 NULL。
1.5、運(yùn)算符和分隔符
? ? ? Java 中大多數(shù)運(yùn)算符和分隔符與C是兼容的,C中提供的運(yùn)算符幾乎完全適合于Java語(yǔ)言。兩者的細(xì)微差別是:
1)C中獨(dú)有間接成員運(yùn)算符(->)、取值運(yùn)算符(*)、地址運(yùn)算符(&)、逗號(hào)運(yùn)算符(,);
2)Java 不提供指針運(yùn)算符,增加了對(duì)象操作符 instanceof、字符串運(yùn)算符+和零填充的右移》等;
3)與C不同的是,Java中算數(shù)運(yùn)算符不能用在布爾類型上,邏輯運(yùn)算符的操作數(shù)只能是布爾型而不能是整型,在轉(zhuǎn)換中需要進(jìn)行特殊處理;
4)C中利用 sizeof 進(jìn)行數(shù)據(jù)分配和釋放內(nèi)存以及獲取的數(shù)據(jù)的個(gè)數(shù),但在java中沒(méi)有此運(yùn)算符,因?yàn)樗械臄?shù)據(jù)類型在所有機(jī)器中的大小都是相同的;
2、數(shù)據(jù)類型
? ? ? C中數(shù)據(jù)類型分為:算書類型、指針類型、數(shù)組類型、結(jié)構(gòu)類型、聯(lián)合類型、枚舉類型、函數(shù)類型和void類型,以下對(duì)上述類型在Java與C的異同以及類型轉(zhuǎn)異換進(jìn)行比較分析。
2.1、算術(shù)類型
? ? ? ? ?C中算術(shù)類型包括整型和浮點(diǎn)型。C中的整型有字符類型、布爾類型和枚舉類型。C中類型大小依賴于C編譯器的具體實(shí)現(xiàn);
? ? ? ? ?Java對(duì)基本數(shù)據(jù)類型大小有明確約定,其中char 是一個(gè)2字節(jié)的無(wú)符號(hào)整數(shù),用來(lái)存儲(chǔ)Unicode字符。除char類型外,Java不支持無(wú)符號(hào)整型,其它整型都是無(wú)符號(hào)的;
并且C中char類型的用法比Java中靈活。C中char類型的數(shù)組和指針可以用來(lái)表示字符串,而Java須使用string類表示。
2.2、結(jié)構(gòu)和聯(lián)合類型
? ? ? ? ?Java中沒(méi)有結(jié)構(gòu)類型;在C中聲明結(jié)構(gòu)變量時(shí)編譯器會(huì)為其分配內(nèi)存空間,而在Java中需要用new來(lái)分配空間;C中允許不完整初始化以及聲明匿名結(jié)構(gòu)(可嵌套),在Java中確實(shí)不被允許的;Java中沒(méi)有與C中對(duì)應(yīng)的聯(lián)合類型這種語(yǔ)言結(jié)構(gòu)。
2.3、枚舉類型
? ? ? ? ? C中,枚舉類型聲明代表整數(shù)常量的符號(hào)名稱,枚舉常量事實(shí)上是int 類型;
? ? ? ? ? Java 中,存在枚舉類型,關(guān)鍵字enum 聲明的枚舉變量事實(shí)上是java.lang.Enum 的一個(gè)子類,可以為其添加屬性和方法,雖然其中的枚舉常量也是int 類型,但不能用整數(shù)初始化,也不能作為整型使用。
2.4、void類型
? ? ? ? ? C 和 Java 都支持 void 類型。
? ? ? ? ? C 中void 可代替函數(shù)參數(shù)表以及表示函數(shù)不帶參數(shù),在建立 void * 類型時(shí),void * 類型的變量可以存儲(chǔ)一個(gè)指向任意類型或函數(shù)的指針;
? ? ? ? ? Java 中的 void 僅表示方法沒(méi)有返回值。
2.5、typedef
? ? ? ? ? C 中 typedef 不是預(yù)處理指令,而是為某一類型創(chuàng)建另外名字的,并且C允許在一個(gè)typedef 中引用另一個(gè) typedef 定義的名字;
? ? ? ? ? Java 中沒(méi)有與之對(duì)應(yīng)的機(jī)制;
2.6、數(shù)據(jù)類型轉(zhuǎn)換
? ? ? ? ? Java 語(yǔ)言屬于強(qiáng)類型語(yǔ)言,對(duì)數(shù)據(jù)類型兼容性要求比C更嚴(yán)格,這保障了他的安全性和健壯性。Java中所有的數(shù)值傳遞,無(wú)論是直接還是通過(guò)參數(shù)傳遞的都先要進(jìn)行類型兼容性的檢查,任何類型的不匹配的都會(huì)產(chǎn)生編譯錯(cuò)誤。在Java 中,整數(shù)類型、浮點(diǎn)數(shù)類型和字符類型是彼此兼容的,但和布爾類型是不兼容的,除了布爾型和枚舉類型,Java中允許吧任何基本類型轉(zhuǎn)換成別的基本類型;
? ? ? ? ? C中表示真/假的變量一直是由int 類型來(lái)表示的。C允許從算術(shù)類型轉(zhuǎn)換為布爾類型。Java 不允許在這兩種類型之間進(jìn)行隱式和顯式的轉(zhuǎn)換,也不能比較布爾型和算術(shù)型。
3、表達(dá)式和語(yǔ)句
? ? ? ? ?Java的表達(dá)式和語(yǔ)句與C的幾近一致,存在一些細(xì)微差別:在Java 中 if、write、for 語(yǔ)句中的條件表達(dá)式應(yīng)該是布爾型,在C中可以是整形;Java 不提供goto語(yǔ)句,goto語(yǔ)句的存在可以改變程序的運(yùn)行方式,是程序的安全性和穩(wěn)定性降低,Java利用代表號(hào)的break 語(yǔ)句和continue語(yǔ)句實(shí)現(xiàn)轉(zhuǎn)移功能;表達(dá)式語(yǔ)句在Java中比C有更多的限制,Java中只允許復(fù)制、函數(shù)調(diào)用、自增減、new 表達(dá)式等出現(xiàn)在表達(dá)式語(yǔ)句中。
4、函數(shù)
1)對(duì)于變量和函數(shù),C需要實(shí)現(xiàn)聲明和定義,而Java中只有定義,沒(méi)有聲明;
2)由于C不是面向?qū)ο蟮?#xff0c;所以C中所有全局變量和函數(shù)本質(zhì)上對(duì)Java而言都是靜態(tài)的。Java是一種面向?qū)ο笳Z(yǔ)言,它不允許在類和接口之外聲明函數(shù),包括 main 函數(shù)和變量。而在C中,常會(huì)出現(xiàn)在一個(gè)文件中定義大量的全局變量,在其他文件中通過(guò)引用聲明這些變量來(lái)實(shí)現(xiàn)共享,但Java不允許有全局變量或函數(shù);
3)當(dāng)C中函數(shù)返回值的類型和聲明時(shí)類型不相符時(shí),函數(shù)的返回值會(huì)自動(dòng)轉(zhuǎn)換為這個(gè)類型之后再進(jìn)行函數(shù)返回;而在Java中面對(duì)次情況時(shí),需要加入強(qiáng)制類型轉(zhuǎn)換;
4)C中函數(shù)調(diào)用參數(shù)計(jì)算的順序是未定義的,而Java 是從左到右有順序的;
5)C中如果變量或函數(shù)在別的文件中定義的,必須使用extern 來(lái)聲明該變量或函數(shù)。在單個(gè)文件編譯的時(shí)候它們是不可見(jiàn),而在鏈接階段才可見(jiàn)。Java的編譯器沒(méi)有這種鏈接階段,所有需要的文件在編譯時(shí)必須可見(jiàn);
6)C和Java程序都從 main 函數(shù)開(kāi)始執(zhí)行。C中main 函數(shù)一般需要有 argc,argv 兩個(gè)參數(shù),argc 存在命令行參數(shù)個(gè)數(shù),argv 存在實(shí)際的命令行參數(shù);java 中main 必須用 stringargs[] 作為方法的參數(shù),它是用來(lái)接收運(yùn)行系統(tǒng)啟動(dòng)Java 應(yīng)用程序時(shí)所用的命令行的參數(shù);
7)C和Java中可以調(diào)用 exit 函數(shù)來(lái)終結(jié)程序;C中可利用abort 函數(shù)來(lái)退出非正常終止的程序,Java 中沒(méi)有相對(duì)應(yīng)的策略。
5、數(shù)組
1)數(shù)組是同一類型的數(shù)據(jù)元素的有序序列。Java 程序在編譯和運(yùn)行時(shí)嚴(yán)格地檢查所有數(shù)組的邊界,提高了程序的安全性;在C中并沒(méi)有提供邊界檢查功能,如此可以提供程序的運(yùn)行速度;
2)在C中,數(shù)組一般是在定義時(shí)就指定其大小,由編譯器分配數(shù)組所需的一塊連續(xù)的內(nèi)存空間,而且數(shù)組中的元素是按順序存儲(chǔ)的;在Java 中,數(shù)組定義時(shí)不被允許指定數(shù)組的大小,同時(shí)也不會(huì)為其分配內(nèi)存空間,需要用new 運(yùn)算符顯示創(chuàng)建,或者通過(guò)初始化方法隱式創(chuàng)建,數(shù)組所占用的空間由Java的來(lái)及收集器自動(dòng)地回收;
3)C 中如果部分初始化數(shù)組,未促使花的元素則被設(shè)置為0。Java并不直接支持多維數(shù)組,但可以創(chuàng)建數(shù)組的數(shù)組,用這種方法可以實(shí)現(xiàn)多維數(shù)組;
4)值得注意的是,在C中數(shù)組實(shí)際得到的是它的指針,而在Java中得到的是引用,不是指針。在Java中程序只能通過(guò)下標(biāo)運(yùn)算符和訪問(wèn)數(shù)組元素,不能像C中的指針那樣通過(guò)整數(shù)加減運(yùn)算來(lái)訪問(wèn)元素;
5)C允許數(shù)組的牽引類型可以為long型,而Java 的要求是 int 型。
6、預(yù)處理器及頭文件的比較
? ? ? ?Java沒(méi)有預(yù)處理器,也沒(méi)有頭文件;C中預(yù)處理器只是接收一些文本并將其轉(zhuǎn)換成為其他文本,編譯器對(duì)預(yù)處理的源程序進(jìn)行編譯,在C中通常用頭文件來(lái)聲明原型以及全局變量、庫(kù)函數(shù)等。
總結(jié)
以上是生活随笔為你收集整理的C 与 JAVA 的对比分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python snap7 plc db_
- 下一篇: 移动web开发规范