2/02/2017

What are advantages of knowing C language if you don't even know it ?

今天在Quora上面看到有人提問說 : 到底了解C語言有什麼好處 ?

這問題讓我印像滿深刻的。在我就讀期間,為了要找一份實習工作,我不得不從embedded system領域轉換成Web development。剛開始的確有點不太適應,總覺得很多寫法都不一樣。到後面才了解其實不是對Javascript不適應,正確來說是對Web和DOM概念不熟悉才是。

不管是Java或是Javascript,如果對C有一定程度熟悉的話,掌握它們的基本語法其實用不到二天的時間。就像上面有人舉了這個例子 :

試著用Javascript去run下這行code :


1
2
3
4
5
6
7
8
9
var myNumber = 4;
var myArray = [4];
makeChanges( myNumber, myArray );
console.log( myNumber + " and " +  myArray); 

function makeChanges( aNumber, anArray ) {
 aNumber++;
 anArray[0]++;
}

你會得到 "4 and 5" 的結果。如果了解C,一定馬上就知道為什麼一個任意數值並不會因為call function 被改變,而array會。

因為C有pointer,而pointer的作用其實跟array是一樣的。如果它們被當作某一個function的參數時,這時就等同於把這個值(被指向或是一個陣列)的地址一起傳送過去。所以這個function真正做的事 : 訪問這個變數的地址,改變這個地址的值。

可是任意數值並沒有。雖然一開始它們己經被賦予了某個值,存放在某個記憶體位址,可是當它們被當作做某個function的參數時,這function是沒辦法訪問這個變數的地址,它能改變的值只能作用於這個function的執行緒裡面,並不能影響其它執行緒的訪問。所以在跳出該function的時候,另一個執行緒訪問同樣的變數其實並不受任何影響。簡單來說,makeChanges所訪問aNumber的地址和外部訪問的myNumber的記憶體位址其實是完全不一樣的。

所以大家才會說,pointer其實是無所不在的,只是被藏起來罷了,因為它真的不好理解。但就如上面有人說 :

電腦硬體是很難以理解的。我們越不去看它,寫出一個程式去叫電腦做些事是越容易。 但我們越深入了解它,我們就更加理解真正要處理問題和原因是什麼。


No comments:

Post a Comment