1. 程式人生 > >C/C++學習總結(複習)

C/C++學習總結(複習)

C/C++學習了太久,有些知識點有些模糊了,花了半個多月,重新整理了一些,自認為比較重要的知識點,主要是用於自己學習。

1.volatile優化總結:

volatile 影響編譯器編譯的結果,指出,volatile 變數是隨時可能發生變化的,與volatile變數有關的運算,不要進行編譯優化,以免出錯

個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。

例如多執行緒程式共享一個變數,它可能會被其他執行緒更改。

2.Volatile功能總結:

a) 告訴編譯器不做任何優化

例如:int a;

a = 1;

a = 2;編譯器可能會省略a=1,直接優化為a=2

b) 表示用volatile定義的變數會在程式外被改變,每次都必須從記憶體中讀取,而不能把他放在cache或暫存器中重複使用

2.malloc 與 calloc的區別:

void *malloc( size_t size ); //分配的大小

void *calloc( size_t numElements, size_t sizeOfElement ); // 第一個引數為元素的個數,第二個引數是每個元素的大小

不同點是:用malloc分配儲存空間時,必須由我們計算需要的位元組數。如果想要分配

5int型的空間,那就是說需要5*sizeof(int)的記憶體空間:最大的區別就是:用malloc只分配空間不初始化,也就是依然保留著這段記憶體裡的資料,而calloc則進行了初始化,calloc分配的空間全部初始化為0,這樣就避免了可能的一些資料錯誤。

3.//關於std::stack的用法

棧少不了的三個核心介面:

1)void push() 插入元素到棧頂

2)void pop() 移除棧頂元素(注意,函式型別為 void)

3)value_type& top() 返回棧頂元素,並不會移除這個元素(注意,返回的是棧頂元素的引用)

4)empty();是否為空

4.虛析構

我們知道,用C++開發的時候,用來做基類的類的解構函式一般都是虛擬函式。可是,為什麼要這樣做呢?下面用一個小例子來說明:    有下面的兩個類:

class ClxBase
{
public:
    ClxBase() {};
    virtual ~ClxBase() {};

    virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};

class ClxDerived : public ClxBase
{
public:
    ClxDerived() {};
    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; 

    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};

    程式碼

ClxBase *pTest = new ClxDerived;
pTest->DoSomething();
delete pTest;

    的輸出結果是:

Do something in class ClxDerived!
Output from the destructor of class ClxDerived!

    這個很簡單,非常好理解。    但是,如果把類ClxBase解構函式前的virtual去掉,那輸出結果就是下面的樣子了:

Do something in class ClxDerived!

也就是說,類ClxDerived解構函式根本沒有被呼叫!一般情況下類的解構函式裡面都是釋放記憶體資源,而解構函式不被呼叫的話就會造成記憶體洩漏。我想所有的C++程式設計師都知道這樣的危險性。當然,如果在解構函式中做了其他工作的話,那你的所有努力也都是白費力氣。    所以,文章開頭的那個問題的答案就是--這樣做是為了當用一個基類的指標刪除一個派生類的物件時,派生類的解構函式會被呼叫。    當然,並不是要把所有類的解構函式都寫成虛擬函式。因為當類裡面有虛擬函式的時候,編譯器會給類新增一個虛擬函式表,裡面來存放虛擬函式指標,這樣就會增加類的儲存空間。所以,只有當一個類被用來作為基類的時候,才把解構函式寫成虛擬函式。

5.虛析構(2

虛解構函式解構函式的工作方式是:最底層的派生類(most derived class)的解構函式最先被呼叫,然後呼叫每一個基類的解構函式。

因為在C++中,當一個派生類物件通過使用一個基類指標刪除,而這個基類有一個非虛的解構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷燬。然而,基類部分很可能已被銷燬,這就導致了一個古怪的“部分析構”物件,這是一個洩漏資源。排除這個問題非常簡單:給基類一個虛解構函式。於是,刪除一個派生類物件的時候就有了你所期望的正確行為。將銷燬整個物件,包括全部的派生類部分。

但是,一般如果不做基類的類的解構函式一般不宣告為虛擬函式,因為虛擬函式的實現要求物件攜帶額外的資訊,這些資訊用於在執行時確定該物件應該呼叫哪一個虛擬函式。典型情況下,這一資訊具有一種被稱為 vptr(virtual table pointer,虛擬函式表指標)的指標的形式。vptr 指向一個被稱為 vtbl(virtual table,虛擬函式表)的函式指標陣列,每一個包含虛擬函式的類都關聯到 vtbl。當一個物件呼叫了虛擬函式,實際的被呼叫函式通過下面的步驟確定:找到物件的 vptr 指向的 vtbl,然後在 vtbl 中尋找合適的函式指標。這樣子會使類所佔用的記憶體增加。

6.const 修飾類成員函式

如果一個成員函式的不會修改資料成員,那麼最好將其宣告為const,因為const成員函式中不允許對資料成員進行修改,如果修改,編譯器將報錯,這大 大提高了程式的健壯性

7.Mutable中文意思是“可變的,易變的”,跟constant(既C++中的const)是反義詞。  在C++中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在一個const函式中。  我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一般會宣告成const的。但是,有些時候,我們需要在const的函式裡面修改一些跟類狀態無關的資料成員,那麼這個資料成員就應該被mutalbe來修飾。

8.指標與引用的區別

指標是變數地址,間接對變數操作。引用相當於是變數的別名,直接對變數本身操作。指標間接操作需要額外的空間存放指標,而引用不需要所以更節省空間。

9.關於引用的總結

1引用變數:1)引用的內部實現為相當於一個指標變數,與指標的實現方式類似;2)引用變數記憶體單元儲存的指向變數地址(初始化時賦值),與指標不同地方時,引用變數在定義時必須初始化,而且使用過程中,引用變數儲存的記憶體單元地址值是不能改變的(這一點通過編譯器來實現保證);3)引用也可以進行取地址操作,但是取地址操作返回的不是引用變數所在的記憶體單元地址,而是被引用變數本身所在的記憶體單元地址;4)引用的使用,在原始碼級相當於普通的變數一樣使用,但在函式引數傳遞引用變數時,內部傳遞的實際是變數的地址值(這種機制的實現是通過編譯器(編譯手段)來實現的)。

10.c++不能過載的運算子

c++不能過載的運算子有.(點號),::(域解析符),?:(條件語句運算子),sizeof(求位元組運算子),typeid,static_cast,dynamic_cast,interpret_cast(三類型別轉換符)。

11.繼承

子類公有(public)繼承父類,所以子類可以通過物件訪問父類的公有成員函式,由於呼叫的是父類的公有成員函式(該函式中的this指標存放的是父類物件的地址),所以列印的是父類A的資料,即便子類與父類的資料同名。

12.c++四種強制型別轉換

(1)dynamic_cast

dynamic_cast只能將指向派生類物件的基類指標或引用轉換為派生類的指標或引用,若用於其他轉換則指標為空,引用則丟擲異常。此為向下型別轉換。

      dynamic_cast轉換符只能用於指標或者引用。dynamic_cast轉換符只能用於含有虛擬函式的類。dynamic_cast轉換操作符在執行型別轉換時首先將檢查能否成功轉換,如果能成功轉換則轉換之,如果轉換失敗,如果是指標則反回一個0值,如果是轉換的是引用,則丟擲一個bad_cast異常,所以在使用dynamic_cast轉換之間應使用if語句對其轉換成功與否進行測試,比如pd=dynamic_cast<D*>(pb); if(pd){…}else{…},或者try{};catch(bad_cast){}

該操作符用於執行時檢查該轉換是否型別安全,但只在多型型別時合法,即該類至少具有一個虛擬方法。dynamic_caststatic_cast具有相同的基本語法,dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。在類層次間進行上行轉換時,dynamic_caststatic_cast的效果是一樣的;在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全

2static_cast

最常用的型別轉換符,在正常狀況下的型別轉換,如把int轉換為float,如:int ifloat f; f=floati;或者f=static_cast<float>(i);

3const_cast

用於取出const屬性,把const型別的指標變為非const型別的指標,如:const int *fun(int x,int y){}int *ptr=const_cast<int *>(fun(2.3))

4reinterpret_cast

interpret是解釋的意思,reinterpret即為重新解釋,此識別符號的意思即為資料的二進位制形式重新解釋,但是不改變其值。如:int i; char *ptr="hello freind!"; i=reinterpret_cast<int>(ptr);這個轉換方式很少使用。

13.區分 淺/深拷貝操作 和 賦值操作:

14.using 訪問名稱空間std

(1)使用using namespace std;放在函式定義之前,讓整個檔案都使用。

(2)使用using namespace std;放在函式定義之內,讓該函式使用。

(3)使用using std::cout,使用指定元素。

(4)不使用using命令,直接使用std::字首。

15.C++命名規則

(1)在名字中只能使用數字,字母和下劃線。

(2)第一個字元不能是數字。

(3)區分大小寫字元。

(4)不能使用c++關鍵字。

16.各型別最小長度

(1)short最少16位。

(2)Int至少與short一樣長。

(3)Long至少32位,且至少與int一樣長.

(4)Long long至少64位,且至少與long一樣長。

17.C++初始化的方式

(1)int a = 10;

(2)Int a(10);

(3)Int a{10};

(4)Int a = {10};

(5)Int a = {};//當大括號中沒有任何內容時,預設初始化為0.

18.C++如何確定常量型別

首先看字尾。字尾是放在數字常量後面的字母,用於表示型別。Ll表示該整數為long型,uU表示為unsigned int型常量,ul表示為unsigned long型。預設的十進位制數將使用能夠儲存該數的最小型別來表示。十六進位制通常使用unsigned int 來表示。

19.單引號雙引號等特殊字元

使用轉義字元來表示。

20.換行三種方式

Cout<<endl;

Cout<<\n;

Cout<<\n;

21.使用八進位制,十六進位制轉義

例如:\nASCII碼值為12.所以可以用\012來表示\n,還可以用0xA來表示。

22.char有無符號

Char在預設情況下既不是有符號,也不是無符號,是否有符號由編譯器來決定。如果有無符號區別特別重要,可以通過signed charunsigned char來顯示的指定。

23.寬字元型別(wchar_t)

寬字串使用L字首。

24.const宣告

在使用const限定符宣告常量時未賦值,則該常量的值是未確定的,且無法修改。

25.使用const定義常量與define定義相比的優勢

a) Const可以明確指定型別。

b) 可以使用c++的作用域規則將定義限制在特定的函式或檔案中。

26.浮點型別

浮點型別儲存是有一個基準數和一個縮放因子。

27.浮點型別的表示法

a) 普通小數點式表示方法

b) E表示法,E代表10的幾次方。

28.三種浮點數型別

a) Float

b) Double

c) Long double

d) Float至少32位,double至少48位,且不少於floatlong double至少和double一樣多。通常float32位,double64位,long double80,96128位。

e) Float至少有6位有效位,double至少有13位是精確的,系統確保15位有效位。

29.浮點型常量

a) 預設都是double型的。

b) f字尾表示為float型。

c) l字尾表示為long double型。

30.浮點型的缺點(精度問題)

程式如下:

Float a = 2.34E+22f;

Float b = a+1.0f;

Cout<<a;

Cout<<a-b<<endl;

結果分析:

a-b = 0;因為afloat型的,只能保持數字的前六位或者前七位,而b對第23位加1,因此修改完之後對這個數並沒有什麼影響,後面的精度已經被丟失了。

31.%運算子

a) 運算元只能是整數。

b) 正負號與被除數保持一致。

32.概述c++自動執行型別轉換的情況:

a) 將一種算數型別的值賦值給另一種型別的值時,c++對值進行轉換。

b) 表示式中包含不同型別時,C++將對值進行型別轉換。

c) 將引數傳遞給函式時,C++將進行型別轉換。C++函式將值返回時,也會進行型別轉換。

33.初始化和賦值進行的轉換

a) C++允許將一種型別的值賦給另一種型別的變數,這樣做的話,型別將被轉化為接受型別的變數。

b) 將一個值賦值給另一個取值更大的型別,通常不會有問題。而將大值賦值給小值通常會有潛在的問題。

i. 將較大的浮點型別轉換為較小的浮點型別,精度會有所降低,而且值可能超出目標的取值範圍,在這種情況下結果將是未知的。

ii. 將浮點型別轉換為整型。會導致小數部分丟失,原來的值可能超出目標型別的取值範圍,結果也將是未知的。

iii. 將較大的整型轉換為較小的整型,如long變為short。原來的值超出目標型別的取值範圍,通常只複製右邊位元組。

34.{}方式初始化時進行的轉換

a) 使用大括號初始化的方式叫做列表初始化,它主要用於對複雜資料進行初始化,所以對型別轉換的要求更嚴格。

b) 列表初始化時不允許窄縮,即變數的型別可能無法表示賦給他的值。例如:不允許將浮點型轉換為整型。在不同整型之間轉換或者整型轉換為浮點型別可能是被允許的,前提是編譯器知道目標變數可以正確的儲存給他的值。例如可使用int變數初始化long型變數,因為long至少與int一樣長;int儲存long型變數也是有可能的,只要int能夠儲存給它的long常量。

i. 例如:

1. Const int code = 66;

2. Int x = 66;

3. Char c1{31325};

4. Char c2 = {66};

5. Char c3{code};

6. Char c4 = {x};

7. X = 31325;

8. Char c5 = x;

分析:12可以。3數太大不可以。Code是常量,c2可以儲存它的值,所以45可以。6不可以,因為x是變數,大小對編譯器來說未知。8可以,因為沒有初始化列表那麼嚴格。

35.表示式中的轉換。

a) 一些型別在出現時就會自動轉換。

i. 在計算表示式時,c++boolcharunsigned charsigned charshort值轉換為int。這些轉換被稱為整型提升。

例:short a = 20;

Short b = 30;

Short c = a+b;

第三步準確分析過程應該是,獲取ab的值將它們轉換為int,最後將這個int的結果轉換為short儲存。

b)編譯器通過校驗表來確定在表示式中的型別轉換

(1)如果有一個運算元是long double,則另一個數被轉化為long double

(2)否則,有一個數是double,則另一個被轉換為double

(3)否則有一個運算元是float,則另一個是float

(4)否則,說明運算元是整數,則進行整型提升。

(5)在這種情況下,如果兩個運算元都是有符號或者無符號的,則將級別低的運算元轉換為高階版運算元。

(6)如果一個運算元是有符號的,另一個運算元是無符號的,且無符號運算元級別較高,則將有符號運算元轉換為無符號所屬型別。

(7)否則,如果有符號型別可表示所有無符號型別所有的可能取值,則將無符號運算元轉換為有符號運算元。

(8)否則,將兩個運算元都轉化為有符號型別的無符號版本。

(9)整數級別的概念:有符號整型級別從高到低依次是long longlongintshortsigned char。無符號與有符號相同。型別charunsigned charsigned char的級別相同。型別bool的級別最低。

36.強制型別轉換

a) (long)a;

b) Long(a);

c) 以上兩種都可以。

37.auto關鍵字的新功能

a) 可以讓編譯器根據初始值的型別判斷變數的型別,而不指定變數的型別、

i. Auto n = 100;//n is int

ii. 處理複雜型別時,自動推斷功能強大。

1. Std::vector(double) scores;

2. Std::vector(double)::iterator pv = score.begin();

可以寫成如下形式:

3. Std::vector(double) scores;

4. Auto pv = scores.begin();

38.大端儲存,小端儲存

小端:較高的有效位元組存放在較高的的儲存器地址,較低的有效位元組存放在較低的儲存器地址。
大端:較高的有效位元組存放在較低的儲存器地址,較低的有效位元組存放在較高的儲存器地址。

39.陣列部分初始化

如果只對陣列部分初始化,其餘部分元素設定為0。如果初始化為{1}而不是{0},則第一個元素賦值為1,其餘仍然為0

40.字串與字元常量呼喚

Char c = abc;

只是將abc所在的記憶體地址,部分賦值給字元c

41.讀取一行

String str;

Getline(cin,str);

42.結構體初始化

支援列表初始化,並且(=)號是可選的。如果{}沒有引數,就預設為0.

最後,不允許縮窄操作。

43.結構體成員賦值

可以使用賦值運算子將結構賦值給另一個同一型別的結構,這樣結構中的每個成員都將被設定為另一個結構相應成員的值,即使成員是陣列。

44.union共用體

建立方式:

Union name

{

Int id;

Char c_id[20];};

45.匿名共用體

Struct haha

{

Union 

{

Long id;

Char str_id[20];

};

};

由於共用體匿名,所以裡面的兩個變數都視為結構體haha的成員。

46.列舉

a) 建立列舉

i. Enum Color{RED,BLUE};

ii. Color成為新型別的名稱

iii. 在不進行強制轉換的情況下,只能講定義列舉時使用的列舉量賦給這種列舉型別。例Color c = (Color)3;

iv. 如果打算只使用常量,而不建立列舉型別的變數,則可以省略列舉型別的名稱。

47.指標和數字

要將數字值作為地址來使用,應通過強制型別轉換,將數字轉換為適當的地址型別。

例:int *pt = (int *)0xB8000000;

48.Delete

不要嘗試釋放已經釋放的記憶體,不能用delete釋放變數宣告得到的記憶體。

然而,對空指標使用delete是安全的。

49.使用new建立動態陣列。

Int *p = new int[10];

對於new建立的陣列,應當使用delete [] p;這種形式來釋放。

方括號告訴delete,應該釋放整個陣列,而不僅僅是指標指向的元素。

50.使用newdelete時應該遵守的守則

a) 不要使用delete釋放不是new分配的記憶體

b) 不要重複delete一塊記憶體多次

c) 如果使用new[]為陣列分配記憶體,則應該使用delete[]來釋放。

d) 如果使用new[]為一個實體分配記憶體,則應該使用delete(沒有方括號)來釋放。

e) 對空指標應用delete是安全的。

51.指標和陣列名的區別

P = p+1;

//p是指標,則表示式是正確的。若p是陣列名,表示式錯誤。陣列名是常量,陣列名的值無法修改,但是指標是變數則可以修改。

52.陣列的地址

陣列名被解釋為陣列的第一個元素的地址,對陣列名取地址,得到的是整個陣列的地址。

從數字上說,兩個地址的值相同,但是意義上並不相同。間接引用的範圍也不同。

53.指標陣列和陣列指標

Int* p[10];//指標陣列

Int (*p)[10];//陣列指標。

54.陣列的靜態聯編和動態聯編

a) 陣列宣告來建立陣列時,是靜態聯編,陣列的長度在編譯時設定。

b) 使用new[]建立陣列時,即採用動態聯編的方式,即在執行時為陣列分配空間。

55.c++三種記憶體資料管理的方式

a) 自動儲存

b) 靜態儲存

c) 動態儲存

56.for規則修改

a) 可以在for迴圈中直接定義變數,這種變數只存在於for語句中,也就是離開了迴圈,這種變數將消失。

b) 但是仍有些編譯器,將for迴圈中定義的變數視為整個函式定義的區域性變數,離開for迴圈後,變數可以正常使用。

57.副作用和順序點

a) 副作用指的是在計算表示式時對某些東西(如儲存在變數中的值)進行了修改。

b) 順序點:在這裡,進入下一步之前將確保對所有的副作用都進行了評估。例如分號就是一個順序點,這意味著在處理下一條語句之前,賦值運算子、遞增運算子和遞減運算子執行的所有修改都必須完成。

c) 例:y=(4+x++)+(6+x++);在上例中,4+x++並不是一個完整的表示式,因此c++不保證x的值在計運算元表示式4+x++x的值立即加1,它只保證整個表示式完成後x的值加2.

58.++++效率問題

a) 對於內建的型別,效率並不會有差別。

b) 對於使用者定義型別,後++需要一個臨時變數,並將臨時變數的值返回,所以前++

相關推薦

C/C++學習總結複習

C/C++學習了太久,有些知識點有些模糊了,花了半個多月,重新整理了一些,自認為比較重要的知識點,主要是用於自己學習。 1.volatile優化總結: volatile 影響編譯器編譯的結果,指出,volatile 變數是隨時可能發生變化的,與volatile

C++ 模板學習總結模板引數的三種形式

之前的一篇文章中介紹了特化和例項化的知識,那麼本次想給大家介紹一下模板的三種引數。 首先呢,要說的是什麼是模板引數,那麼如果使用過模板的同學會知道在定義一個模板的時候需要在定義上面寫上一行諸如template<typename T>這樣的程式碼,那麼這行中定義的

C語言學習總結1-遞迴函式的理解

啥是遞迴? 即是該函式呼叫它本身自己,這種呼叫過程稱為遞迴。 遞迴可以相當於迴圈,所以想結束遞迴,就必須有終止遞迴的條件測試部分,否則就會出現無限遞迴(即無限迴圈)。同時,這也是使用遞迴的難點

C語言學習總結——C庫函式總結

C 庫函式主要指那些由美國國家標準協會(ANSI)或國際標準化組織(ISO)釋出的標準中規定的庫函式,按照標準 C 的要求來進行 C 語言程式設計是很重要的,因為這樣你的程式碼才有可能跨平臺使用。 最早的 C89 中有15個標準標頭檔案: asse

c++學習總結——運算子過載與標準模板庫STL

一、心得總結     運算子過載使得使用者自定義的資料以一種更簡潔的方式工作。例如在做ATM模擬系統時,使用過載“<”來比較時間,可以簡化程式,減少程式碼。另外,我們也可以過載運算子函式,將運算子用於操作自定義的資料型別。過載運算子函式可以對運算子做出新的解釋,即定義使用

c++學習總結——類與物件

一、心得感悟     c語言的課程學習後,開始c++的學習,首先就是學習類。在學習類時,類的使用與c語言有著極大的差別,一開始學習十分別扭。c語言的學習直接定義幾個形參、函式就可以寫程式了;而到了c++學習,關於類,首先必須定義類。具有相同性質和功能的東西構成的集合,通常歸成一

c++學習總結——虛擬函式與多型

一、學習總結     在面向物件程式設計中,多型性是指一個名字,多種語義;或者介面相同,多種實現。過載函式是多型性的一種簡單形式。C++為類體系提供一種靈活的多型機制——虛擬函式。虛擬函式允許函式呼叫與函式體的聯絡在執行時才進行,成為動態聯編。類、繼承和多型,提供了對軟體重用性

c++學習總結——繼承

一、心得體會     之前的程式碼在定義類時,如果需要多次用到某一個類,都需要反覆定義使用它,但繼承的學習卻彌補這一缺點。整合式面向物件程式設計中軟重用的關鍵技術。繼承機制使用已經定義的類作為基礎建立新的類定義,新的類時原有類的資料及操作與新類所增加的資料及操作的組合。新的類把

《深度探索C++物件模型》學習總結——前言與導讀

前言 Foundation專案:為了構建大系統而努力定義的一個新的開發模型。 ALF:一種一面物件層次結構,提供一個永久的、以語意為基礎的表現法。 Simplifier的工作:轉換內部的程式表現。 任何物件模型都需要的轉換風味(?): 1. 與

C/C++日常學習總結第一篇const用法及printf的執行順序

1.c語言中printf在不同編譯器下面的執行順序    【程式碼】:   int n = 0; printf("%d,%d,%d",++(++n),++(++n),++(++n));    【結果】:      VC6.0下面的結果是:6,5,4        

c 語言學習筆記基礎

lac alert https 內容 con 標記 prime c++ prime c基礎 近期工作上有對C語言算法上的需求,所以要學C,上學的時候沒學過,只學過半年的Java(我是專升本,本科學的材料),2015年工作後也學過C,那時候的需求是能看懂就可以,也就沒深入研究

C語言學習系列C語言基本語法和數據類型

.html 二進制 占用 efault html pac 精度 es2017 %d 一、基本語法 C的令牌(Tokens)   C 程序由各種令牌組成,令牌可以是關鍵字、標識符、常量、字符串值,或者是一個符號。 關鍵字(保留字) auto else long swit

C語言學習系列存儲類

amp 限制 () 存儲 col print strong .com 學習 一、C存儲類 存儲類定義C程序中變量/函數的範圍(可見性)和生命周期。這些說明符放置在他們所修飾的類型之前。for example:auto、register、static、extern。 (一)、

C語言學習系列基本語法

xor 12px 左移 程序 str 繼續 p s type false 一、C運算符 算術運算符(語法和java類似或基本一樣略過不再描述) 關系運算符(略) 邏輯運算符(略) 位運算符 運算符描述實例 & 如果同時存在於兩個操作數中,二

C#常見問題總結

7月 組件 圖片 水晶報表 datetime 控制臺 col orm value 1、erp系統可以在具有固定ip的擁有多層服務器的局域網中使用嗎?如何使用解決方法:把ini.配置文件字符串中的服務器名改成服務器的,把debug文件夾拷到其他機器上就行,服務器上的服務器名是

C語言學習筆記4—— 數據類型的使用

循環小數 強制類型轉換 進行 代碼 size 圖片 unsigned 問題 d+  在程序設計語言裏,我們會把數據分為各種各樣的類型,為什麽會有數據類型之分呢?計算機中,所有的數據都會表示成二進制數的形式,對於同樣的一個二進制數,數據類型不同,它表示的數據就是不同的。也就是

C語言學習筆記5—— 語句1

  c程式常見結構大概有選擇結構,迴圈結構,順序結構。c程式由一個一個的函式構成,而構成函式的則是語句,語句包含賦值語句,迴圈語句,條件語句,分支語句。賦值語句對與我們來說是很熟悉的。條件語句,分支語句與迴圈語句則會在後面一一介紹到。   順序結構對於我們來說是很熟悉的,它可以是這個樣子。 &nbs

C語言學習筆記5—— 語句2

  在介紹過順序結構和選擇結構以後,我們能通過c語言做的事依舊很少,比如換硬幣問題。將一元的人民幣換成一分,兩分,五分的硬幣共50枚。如何解決這樣的問題呢?我們可以把它化解成一個求解線性方程組的問題。   可以設需要一分的硬幣x枚,兩分的硬幣y枚,五分的硬幣z枚。於是,我們可以得到一個方程組,像這樣:x+y

Object C語法學習筆記

1、@property與@synthesize配對使用。 @property預編譯指令的作用是自動宣告屬性的setter和getter方法。 @synthesize 建立了該屬性的訪問程式碼 功能:讓編譯好器自動編寫一個與資料成員同名的方法宣告來省去讀寫方法的宣告。 2、強引用(__st

C語言學習系列

1.計算機與程式設計語言的關係 答:計算機由 硬體 與 軟體系統 組成,硬體提供了物質基礎, 而軟體則是計算機的靈魂;如果脫離了軟體,計算機就只是一臺  什麼都做不了的裸機;可以形象地把他們比作人的大腦與身體,缺一不可。 2.