C C 疑難點(不斷更新中 )

2021-06-16 07:39:02 字數 2747 閱讀 5503

1、cout和 指標輸出

#include using namespace std;

int main()

cout的

運算是從右向左進行的,但最後

輸出還是從左到右。也就是說,先運算++(*p)從後向前。

(1).

++*p:先運算*p,值++:p指向s[0],並把s[0]加1做為表示式的值,所以輸出為1,此時s[0]=='1'

(2).

++(*p):同1,先運算*p,值++:p還指向s[0](s[0]現在的值為1),並把s[0]加1做為表示式的值,所以輸出為2,此時s[0]=='2'

(3).

*(++p):指標p位置++,然後*取值:p指向s[1],然後取s[1]的值作為表示式的值,輸出'1'

(4).

*++p :同3,指標p位置++,然後*取值:p指向s[2],然後取s[2]的值作為表示式的值,輸出'2'

(5).

(*p)++:同1,先運算*p,值++:p還是指向s[2],取s[2]的值作為表示式的值,所以輸出'2',然後s[2]的值加1,s[2]==3

(6).

*(p++):先取*p的值,然後指標p位置++:p還是指向s[2](現值為3),取s[2]的值作為表示式的值,所以輸出'3',然後p指向s[3]

(7).

*p++ :同6,先取*p的值,然後指標p位置++:p指向s[3],取s[3]的值作為表示式的值,所以輸出'3',然後p指向s[4];

結果:s陣列為 "213345678",輸出「3324444」

2、%d的記憶體讀取 和 記憶體儲存

#include int main()

1,0,1

1,2147483647,1

1,1,0

請按任意鍵繼續. . .

為什麼會這樣?我最開始也沒想明白,我認為自己輸出自己的就好了嘛!~

但是情況不是這樣的,輸出結果如上。分析一下原因:(個人見解,可能不對,請指出)

(1)unsigned long long 是8位元組的,int是4位元組的。(32位機器)

(2)%d,是不進行安全檢查的,都只是去取4個位元組使用。

(3)現在的x86的機器都是使用的記憶體小端儲存的方式。這3個變數在記憶體中的位置如下:

0x0012ff08  cc cc cc ccff ff ff 7f  

????....

0x0012ff10  cc cc cc cc cc cc cc cc  ????????

0x0012ff18  01 00 00 00 00 00 00 00  ........

0x0012ff20  cc cc cc cc cc cc cc cc  ????????

0x0012ff28  01 00 00 00 cc cc cc cc  ....????

可以看出記憶體中是 從高位向低位 存放,先宣告的i在最記憶體的高位,而且資料的低位元組在低位,高位元組在高位,這就是小端儲存的原因。

(4)解釋(3)可能與本題無關哈,就當拓展下吧。當輸出(x,i,n)順序時,通過(1)(2)可知,第乙個%d其實取的是x的前4位也就是低位它的值是1;到第2個i的時候,本來應該取i的記憶體值,但是發現緊接著第乙個%d的值的後面還有4個位元組,它就取了這4個位元組的資料當值,而這4個位元組其實是x的高位值是0;到了第三個%d自然接著向後取到的是原本i的資料。所以輸出結果是(1,0,1)。

(5)第二組和第三組,原理是一樣的。第三組結果看似正確,是因為最後取的x。其實是x值失去了高位的4位元組的值。只不過因為它是0,沒有體現出來而已。

(6)出現這樣取值的原因,還有就是 printf %d 的運算順序是從右向左。但輸出的順序是從左向右進行取值的。

3、const和指標

int * const p = &n;		//必須先初始化

*p=20; //ok,值可以改變

p = &n; //error,不能改變指向

const int * p1; //可以不初始化

*p1=20; //error,值不可以改變

p1 = &n; //ok,可以改變指向

int const * p2; //可以不初始化

*p2=20; //error,值不可以改變

p2 = &n; //ok,可以改變指向

const int * const p3 = &n; //必須先初始化

*p3=20; //error,值不可以改變

p3 = &n; //error,不能改變指向

4、const成員函式

class a

int getconsta() const

int geta()

int setconsta(int a) const

int seta(int a)

};

a a1;

const a a2;

int t;

t = a1.getconsta();

t = a1.geta();

t = a2.getconsta();

t = a2.geta(); //a2是const物件,呼叫非const成員函式產生編譯錯誤。

libuv 不斷更新

initialize the uv async t handle.a null callback is allowed.note that uv async init unlike other libuv functions,immediately starts the handle.to stop...

Python技巧 不斷更新中

1.讀取檔案的內容 filepath 檔案路徑 lambda f f.read f.close file filepath 0 2.將內容寫入到檔案中 lambda f,d f.write d f.close file r d a.txt w 要寫入的資料 3.根據正規表示式過濾資料夾中的檔案 im...

SQL語句學習(不斷更新中。。。。。。)

1.在where字句中使用別名。錯誤!直接這樣寫是不行的,where字句是不認識別名的 select sal as salary,comm as commission from emp where salary 5000 正確的方法,使用乙個子檢視 select from select sal as...