C 變數的「總分性」(Mereology)

2022-07-15 04:54:09 字數 2276 閱讀 8507

stroustrup在自傳中說自己在哲學上深受 kierkegaard (吉爾凱高爾)的影響,而討厭黑格爾。所以看stroustrup的書,很少感受到抽象理論的重要性。這也影響了c++的文化:許多c++程式設計師很會寫**,但是概念說不清楚,感覺生活很難( :)。 這多多少少怪c++的鼻祖stroustrup本人。

閒話少說,關於c++變數的屬性問題,是c++最根本的問題。然而我還沒有讀過一本書能從抽象,理論高度說清楚的。今天我就試圖談談c++變數的屬性。我認為,每個c++變數有六個無法分離的屬性(把合併),理解了,你就入了c++的門:

c++中沒有「未知類」變數

c++的變數用名字的唯一性來辨識,同一scope中沒有同名的變數

資料段(data segment)變數

堆疊(stack) 變數

堆疊(heap) 變數:(只能是分變數)

1。預設名空間( ::  namespace)

2。命名空間( named namespace)

3。無名空間(anonymous namespace):檔案變數

4。型 (static class variable or type variable)

5。例項(instance class member variable)

6。函式內 - 靜態 (static variable in a function)

7。函式內(或**塊內)- 動態 (auto variable or stack variable)

程式初始至結束:global

**塊(code block): auto

new/delete: free

第一次使用至程式結束: static in function

直接內容

直接變數

間接內容

指標變數

引用變數

總(whole variable)變數

分(part variable)   變數:即成員變數

前四個屬性都有著述,而第五,六個屬性似乎無人或鮮有人提出。

關於「總分性」,該詞這是我在查mereology翻譯時找到的唯一較好的翻譯。我幾乎找不到有前人論述的資訊(知道的請告訴我)。

他的意思是「總體」與「部分」的關係。翻譯成總部也不好,總分亦不完美,但是比總部稍稍謙虛點:)

有了這個概念,我們可以進一步區分兩種變數:

a. 獨立變數:是個總體,不屬於任何變數,或可稱為「母變數」

b. 成員變數:是個部分體,隸屬乙個總變數,或可稱為「子變數」

為什麼總分性對於乙個變數很重要呢?因為:

1) 乙個儲存屬性為 heap 的變數只能為子變數。

a* pa = new a;  //line1

pa是指標變數,它本身不在heap中,它只是「指向heap位址」。

如果a定義為class a那麼line1導致了子變數b的儲存屬性是heap.

從另乙個角度說,heap中的母變數總是無名的,它只有通過指標間接地存在。

2) 子變數的儲存屬性決定於母變數的儲存屬性

比如 class a

; class b

;foo

()b作為母變數,儲存屬性是堆疊,而它的子變數pa,也在堆疊中。如果b *b = new b,那麼pa的屬性就是heap

3)子變數在執行時可以被優化成其母變數的「」,所以它的讀/寫是通過它的母變數進行的,不用單獨「取址」(即按名取址),效能較母變數稍好。

比如b.f1可以被優化為b+offsetof(f1), f1在執行時被「抹去名字」。

理解c++變數的六大屬性,是深入理解c++變數,也是c++語義的重要一環。由於「總分性」的概念不為專家強調,這裡專門著文小序,以期拋磚引玉。

C語言 找出總分最高的學生

題目描述 給定n個學生的基本資訊,包括學號 由5個數字組成的字串 姓名 長度小於10的不包含空白字元的非空字串 和3門課程的成績 0,100 區間內的整數 要求輸出總分最高學生的姓名 學號和總分。輸入格式 輸入在一行中給出正整數n 10 隨後n行,每行給出一位學生的資訊,格式為 學號 姓名 成績1 ...

PTA 找出總分最高的學生 C語言

給定n個學生的基本資訊,包括學號 由5個數字組成的字串 姓名 長度小於10的不包含空白字元的非空字串 和3門課程的成績 0,100 區間內的整數 要求輸出總分最高學生的姓名 學號和總分。輸入格式 輸入在一行中給出正整數n 10 隨後n行,每行給出一位學生的資訊,格式為 學號 姓名 成績1 成績2 成...

C 變數的儲存持續性 作用域和鏈結性

資料摘自 c primer plus 儲存持續性 1自動儲存持續性 在函式定義中宣告的變數 包括函式引數 的儲存持續性為自動的。它們在程式開始執行其所屬的函式或 塊時被建立,在執行完函式或 塊時,它們使用的記憶體被釋放。2靜態儲存持續性 在函式定義外定義的變數和使用關鍵字static定義的變數的儲存...