c語言高手進

2022-10-08 06:46:13 字數 6400 閱讀 7320

1樓:匿名使用者

這裡主要研究一下c語言和c++中的a++,++a;有雙操做數和多操做數之分

雙操做數:

在語言中定義a++是先用後加,++a是先加後用。

實際上對雙操做數來說的是在一個語句中結束前加和後加的問題。

即如k=(++a)+(a++);

a++是語句結束後在後加,

++a是先加後計算再語句結束。

我舉幾個例子(用反彙編說明)

1 int k=2;

int val=0;

val=(k++)+(k++);

反彙編8: int k=2;

00401028 mov dword ptr [ebp-4],2//// k的地址是dword ptr [ebp-4]

9: int val=0;

0040102f mov dword ptr [ebp-8],0//val的地址是dword ptr [ebp-8]

10: val=(k++)+(k++);

00401036 mov eax,dword ptr [ebp-4]// 把2放入eax中

00401039 add eax,dword ptr [ebp-4]// 把2+2=4放入eax中

0040103c mov dword ptr [ebp-8],eax//把eax中的4移回val中

0040103f mov ecx,dword ptr [ebp-4]

00401042 add ecx,1//

00401045 mov dword ptr [ebp-4],ecx//k地址中的值加1,k=3

00401048 mov edx,dword ptr [ebp-4]

0040104b add edx,1// 暫存器中的值加1,k=4

0040104e mov dword ptr [ebp-4],edx//移回k地址

結論:val=*( dword ptr [ebp-8])=4;k=4

2. int k=2;

int val=0;

k=(k++)+(k++);

反彙編8: int k=2;

00401028 mov dword ptr [ebp-4],2//同上

9: int val=0;

0040102f mov dword ptr [ebp-8],0

10: k=(k++)+(k++);

00401036 mov eax,dword ptr [ebp-4]

00401039 add eax,dword ptr [ebp-4] //同上

0040103c mov dword ptr [ebp-4],eax//同上,不同的是計算結果存入k地址k=4

0040103f mov ecx,dword ptr [ebp-4]

00401042 add ecx,1//暫存器中的值加1,

00401045 mov dword ptr [ebp-4],ecx//k=5

00401048 mov edx,dword ptr [ebp-4]

0040104b add edx,1//暫存器中的值加1

0040104e mov dword ptr [ebp-4],edx//k=6

結論:k=*( dword ptr [ebp-4])=6;

3 int k=2;

int val=0;

val=(++k)+(++k);

反彙編:

8: int k=2;

00401028 mov dword ptr [ebp-4],2// k的地址是dword ptr [ebp-4]

9: int val=0;

0040102f mov dword ptr [ebp-8],0//val的地址是dword ptr [ebp-8]

10: val=(++k)+(++k);//k先加

00401036 mov eax,dword ptr [ebp-4]

00401039 add eax,1//暫存器中的值加1

0040103c mov dword ptr [ebp-4],eax//k=3

0040103f mov ecx,dword ptr [ebp-4]

00401042 add ecx,1//對k地址中的值加1,k=4

00401045 mov dword ptr [ebp-4],ecx

00401048 mov edx,dword ptr [ebp-4]

0040104b add edx,dword ptr [ebp-4]//k+k=8

0040104e mov dword ptr [ebp-8],edx//值移入val地址中val=8

結論:val=*( dword ptr [ebp-8])=8;k=4

4. int k=2;

int val=0;

k=(++k)+(++k);

反彙編:

8: int k=2;

00401028 mov dword ptr [ebp-4],2

9: int val=0;

0040102f mov dword ptr [ebp-8],0

10: k=(++k)+(++k);

00401036 mov eax,dword ptr [ebp-4]

00401039 add eax,1

0040103c mov dword ptr [ebp-4],eax

0040103f mov ecx,dword ptr [ebp-4]

00401042 add ecx,1

00401045 mov dword ptr [ebp-4],ecx

00401048 mov edx,dword ptr [ebp-4]

0040104b add edx,dword ptr [ebp-4]///以上同3例

0040104e mov dword ptr [ebp-4],edx// 值移入k地址k=8

結論:k=*( dword ptr [ebp-4])=8;

5. int k=2;

int val=0;

val=(++k)+(k++);

反彙編:

8: int k=2;

00401028 mov dword ptr [ebp-4],2

9: int val=0;

0040102f mov dword ptr [ebp-8],0

10: val=(++k)+(k++);

00401036 mov eax,dword ptr [ebp-4]

00401039 add eax,1

0040103c mov dword ptr [ebp-4],eax//k=k+1=3

0040103f mov ecx,dword ptr [ebp-4]

00401042 add ecx,dword ptr [ebp-4]//k+k=6

00401045 mov dword ptr [ebp-8],ecx//val=6

00401048 mov edx,dword ptr [ebp-4]

0040104b add edx,1//k=k+1=4

0040104e mov dword ptr [ebp-4],edx

結論:val=*( dword ptr [ebp-8])=6;k=4

6. int k=2;

int val=0;

k=(++k)+(k++);

反彙編:

8: int k=2;

00401028 mov dword ptr [ebp-4],2

9: int val=0;

0040102f mov dword ptr [ebp-8],0

10: k=(++k)+(k++);

00401036 mov eax,dword ptr [ebp-4]

00401039 add eax,1//k+1

0040103c mov dword ptr [ebp-4],eax//k=3

0040103f mov ecx,dword ptr [ebp-4]

00401042 add ecx,dword ptr [ebp-4]//k+k=6

00401045 mov dword ptr [ebp-4],ecx//k=6

00401048 mov edx,dword ptr [ebp-4]

0040104b add edx,1

0040104e mov dword ptr [ebp-4],edx//k=k+1=7

結論:k=*( dword ptr [ebp-4])=7;k=7

多操做數

多操做數(>2)頭兩個操做數同以上(中間值)而後面的數如是(++i)加1

如是(i++)不加1。賦值給變數如果不是本身則結束;

如果是本身則要數(i++)個數如是n加n

舉幾個例子

1.int k=2;

int val=0;

val=(k++)+(k++)+(++k);

反彙編:

331: int k=2;

00407488 mov dword ptr [ebp-14h],2

332: int val=0;

0040748f mov dword ptr [ebp-18h],0

333: val=(k++)+(k++)+(++k);

00407496 mov eax,dword ptr [ebp-14h]

00407499 add eax,dword ptr [ebp-14h]//以上同雙操做數中間數存在eax中eax=4,k=2

0040749c mov ecx,dword ptr [ebp-14h]

0040749f add ecx,1

004074a2 mov dword ptr [ebp-14h],ecx//k=3

004074a5 add eax,dword ptr [ebp-14h]//eax+k=

004074a8 mov dword ptr [ebp-18h],eax//賦值給val=eax+k=7

004074ab mov edx,dword ptr [ebp-14h]

004074ae add edx,1

004074b1 mov dword ptr [ebp-14h],edx

004074b4 mov eax,dword ptr [ebp-14h]

004074b7 add eax,1

004074ba mov dword ptr [ebp-14h],eax

結論:val=*( dword ptr [ebp-18h])=7;k=5

2.int k=2;

int val=0;

k=(k++)+(k++)+(++k);

反彙編:

331: int k=2;

00407488 mov dword ptr [ebp-14h],2

332: int val=0;

0040748f mov dword ptr [ebp-18h],0

333: k=(k++)+(k++)+(++k);

00407496 mov eax,dword ptr [ebp-14h]

00407499 add eax,dword ptr [ebp-14h]

0040749c mov ecx,dword ptr [ebp-14h]

0040749f add ecx,1

004074a2 mov dword ptr [ebp-14h],ecx

004074a5 add eax,dword ptr [ebp-14h]

004074a8 mov dword ptr [ebp-14h],eax//賦值給k=eax+k=7

004074ab mov edx,dword ptr [ebp-14h]

004074ae add edx,1

004074b1 mov dword ptr [ebp-14h],edx//k=k+1=8

004074b4 mov eax,dword ptr [ebp-14h]

004074b7 add eax,1

004074ba mov dword ptr [ebp-14h],eax//k=k+1=9

結論:val=*( dword ptr [ebp-14h])=9;

舉個題1.

int k=2;

int val =0;

val=(++k)+(++k)+(k++)+(++k) +(++k) +(++k) +(++k) +(k++)+(k++)+(k++);

val=4 + 4 +4 +5 +6 +7 +8 +8 +8 +8= 62

2.int k=2;

int val =0;

k=(++k)+(++k)+(k++)+(++k) +(++k) +(++k) +(++k) +(k++)+(k++)+(k++);

4個k++

k=4 + 4+ 4 +5 +6 + 7 + 8 +8 +8 +8 在加 4=66

c語言問題,高手進C語言問題,高手進

第1個東西沒做過不過告訴你思路 設農夫為0,狼1,羊2,菜3,相鄰的不可以在一起無聊是在岸上還是船上。所以你就以0開始搜,不達到要求的過,最後就會出來結果 迷宮問題我都做爛了你要的是4方向的吧,給你一個還不錯的 include include include using namespace std ...

求助C語言高手,求助C語言高手!

inlcude include int main file fopen a.dat rw 開啟a.bat檔案,存入file指標裡 for i 0 i 200 i return 0 返回 return 這就是現在的大學生 在學校混文憑!題目出的不錯,你們老師有點水平 一樓的做得不太完整,隨機數有問題,...

求c語言高手幫忙編個程式,求C語言高手幫忙編個程式!

include include unsigned char weizhi 10000 int currentstep 0 unsigned char zuoanlang 32 unsigned char zuoanyang 16 unsigned char zuoanbaicai 8 unsigne...