C是只能使用標量的語言

2021-06-17 18:26:11 字數 1075 閱讀 4226

本書被稱為日本最有營養的c 參考書。作者是日本著名的毒舌程式設計師,其言辭犀利,觀點鮮明,往往能讓讀者迅速領悟要領。書中結合了作者多年的程式設計經驗和感悟,從c 語言指標的概念講起,通過實驗一步一步地為我們...  

立即去當當網訂購

對於標量(scalar)這個詞,大家可能有些陌生。

簡單地說,標量就是指char、int、double和列舉型等數值型別,以及指標。相對地,像陣列、結構體和共用體這樣的將多個標量進行組合的型別,我們稱之為聚合型別(aggregate)。

早期的c語言一度只能使用標量。

經常聽到初學者有以下的提問:

if (str == "abc")

這樣的**為什麼不能執行預期的動作呢?確實已經將「abc」放到了str中,條件表示式的值卻不為真。這是為什麼?

對於這樣的疑問,通常給出的答案是「這個表示式不是在比較字串的內容,它只是在比較指標」,其實還可以給出另外乙個答案:

字串其實就是char型別的陣列,也就是說它不是標量,當然在c裡面不能用==進行比較了。

c就是這樣的語言,一門「不用說對於輸入輸出,就連陣列和結構體也放棄了通過語言自身進行整合利用」的語言。

但是,如今的c(ansi c)通過以下幾個追加的功能,已經能夠讓我們整合地使用聚合型別了。

結構體的一次賦值

將結構體作為函式返回值傳遞

將結構體作為函式返回值返回

auto變數的初始化

當然,這些都是非常方便的功能,如今已經可以積極地使用了(不如說應該去使用)。可是在早期的c語言裡,它們是不存在的。為了理解c語言的基本原則,了解早期的c語言也不是什麼壞事。

特別要提出來的是,即使是ansi c,也還不能做到對陣列的整合利用。將陣列賦值給另外乙個陣列,或者將陣列作為引數傳遞給其他函式等手段,在c語言中是不存在的。

但是,因為結構體是可以被整合利用的,所以在實際的程式設計中,應該積極地使用其可用的功能。直到現在,還經常能看到使用memcpy()來進行結構體一次賦值的例子,真是做無用功。如果想要複製結構體,還是讓我們使用結構體一次賦值這個功能吧。

C語言 a 的寫法是錯的

a 得到的是乙個右值,操作需要的是乙個左值。a 返回的是乙個右值,不對再 了,可以寫成 a a 的意思是先複製乙份臨時資料出來參與周邊環境的運算,再自加變數a,可見a 用來參與運算的是乙份複製出來的臨時資料,這個資料是臨時存在而沒有固定位址的,不是乙個真正的變數。a的意思是先自加變數a,再將變數放到...

為什麼C語言中使用的位址是假的

在c語言中,指標變數的值就是乙個記憶體位址,運算子的作用也是取變數的記憶體位址,請看下面的 include include int a 1,b 255 int main 在 c free 5.0 下執行,結果為 pa 0x402000,b 0x402004 中的 a b 是全域性變數,它們的記憶體位...

什麼是C語言中的runtime?

大體來說,runtime是與runtime library密不可分的,這些庫依賴於特定的執行平台。按照wiki上的說法 在計算機程式設計中,runtime library執行時庫,是指一種被編譯器用來實現程式語言內建函式一提供該語言執行時 執行時 支援的一種特殊的計算機程式庫,這種庫一般包括基本的輸...