C語言與Java的異同
作者:終南 <li.zhongnan@hotmail.com>
自工作以來,先用VB、ASP這些編程;後來轉用Java,對物件導向的語言有了些許瞭解,如今又主要用C語言寫一些代碼。由於學校的時候學過一些C語言的知識,後來也大略寫過一些幾百行簡單程式,因此這段時間來,對C的上手也算比較快速。
面對的所有東西都可謂博大精深,更何況那麼多人使用的Java以及曆史悠久的C語言。不過手之所至,按鍵不由此起彼伏,便有了對C語言和Java的一些感悟。
相同的地方:
1、文法類似:
由於Java可以算是從C++發展而來的,因此Java與C語言的文法比較類似
2、編程的熟練程度就是對語言程式庫的掌握程度:
從某種程度上來說,程式設計語言都是由文法和相應的程式庫所構成,Java有自身的類庫,C語言則有標準庫。所謂的編程,就是使用與文法來調用和組合程式庫中的函數。
不同的地方:
1、記憶體管理
在Java中,基本不用考慮記憶體的問題,如果想用一個對象,new一個就可以,這個過程的背後則是JRE為對象分類的一定記憶體,當JRE發現你不再使用這個對象的時候,他就會自動回收記憶體,也就是說你只管借東西,不用管歸還,因為與有人當你的跟班,在你不使用的時候就把東西歸還了,不過這個過程還是有的,只不過是JRE作的而已。
但是C則不同,如果你想用,你可以用malloc之類的方法申請記憶體,當你使用完了,因為沒有跟班的,你需要自己把這塊記憶體歸還回去,也就是調用free方法來完成這個任務。由於需要顯式的歸還記憶體,因此當一個函數需要將一塊記憶體返回給調用者的時候,問題就比較複雜了,不如物件導向和具有記憶體回收功能的Java那麼直觀了。對於這個問題,在C語言中,有幾種解決方案:
(1) 在調用者中先分配好記憶體,作為參數傳入到被調用的函數中
(2) 在被調用的函數中分配,使用完後在調用者中釋放
(3) 在被調用函數中使用static變數,可以將該變數返回
2、物件導向
Java的物件導向的特點很明顯,而C則是一個地道的結構化語言。 Java中有一個字串類String, 通過調用 String.length()就可以知道字串的長度,但是在C語言中,則需要調用函數strlen(str)來得到字串(字元數組)的長度。由於C不是物件導向的語言,也就沒有this的概念,因此當使用一個與某個“東西”相關的函數時,就需要不厭其煩的將代表這個“東西”的變數作為參數傳遞進去。
3、名稱空間
Java通過包(package)來實現名稱空間,在C語言中,所有的函數都處於同一名稱空間,也就是沒有名稱空間,因此就會很多程式提供的api介面函數都有一個首碼,例如MYSQL的mysql_init(), mysql_real_connect(), mysql_real_query()等函數名稱前面的mysql_。
附:C語言編寫的split函數,從中可以看看C的記憶體管理
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **split(char *str, char *delim)
{
static char **str_arr = NULL;
static char *cstr = NULL;
if (str_arr)
{
free(str_arr);
str_arr = NULL;
}
if (cstr)
free(cstr);
cstr = (char *)calloc(strlen(str)+1, sizeof(char));
strcpy (cstr, str);
char *p;
int n = 0;
p=strtok (cstr, delim);
while (p!=NULL)
{
n++;
if (str_arr == NULL)
str_arr = (char **)malloc(sizeof(char *));
else
str_arr = (char **)realloc(str_arr, n * sizeof(char *));
str_arr[n - 1] = p;
p=strtok(NULL, delim);
}
str_arr = (char **)realloc(str_arr, (n+1) * sizeof(char *));
str_arr[n] = NULL;
return str_arr;
}
int main ()
{
char *str = "Please split this phrase into tokens";
char *delim = " ";
char **str_arr ;
str_arr = split(str, delim);
while (*str_arr)
{
printf("/t%s/n", *str_arr);
str_arr++;
}
return 0;
}