C語言與Java的異同

來源:互聯網
上載者:User

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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.