今天做了乙個有趣的測試

2021-04-02 08:59:09 字數 1885 閱讀 7796

雖然很忙,居然很懶,不想做事。

在電腦跟前瀏覽**,突然看到了一篇文章,是

joel spolsky(

周思博)寫給畢業生的,裡面有這麼一段:

「無論你知道多少高階的控制結構,知道如何進行錯誤處理,如果你不能解釋為什麼while *s++ = *t++;的意思是進行字串拷貝(而且對你而言這是世界上最自然,最易懂的**),那麼你就是在對程式設計一竅不通的狀態下程式設計(

programming based on superstition)。」

暈啊,我就不懂啊。

趕快去試試。先用的vc6,**如下:(哈哈,真少)

#include "stdafx.h"

int main(int argc, char* argv)

編譯,執行,什麼都沒有,還報錯了。

嗯,看看彙編語句是什麼樣子的

while(*t++ = *s++);

0040b7ff 8b

55 f

8movedx,dword ptr [ebp-8]

0040b802 8b 45 fcmoveax,dword ptr [ebp-4]

0040b805

8a

08movcl,byte ptr [eax]

0040b807 88

0a

movbyte ptr [edx],cl

0040b809 8b

55 f

8movedx,dword ptr [ebp-8]

0040b

80c

0f

be 02movsxeax,byte ptr [edx]

0040b

80f

8b 4d f8movecx,dword ptr [ebp-8]

0040b812

83 c

1 01addecx,1

0040b815 89 4d f8movdword ptr [ebp-8],ecx

0040b818 8b 55 fcmovedx,dword ptr [ebp-4]

0040b81b

83 c

2 01addedx,1

0040b81e 89 55 fcmovdword ptr [ebp-4],edx

0040b821

85 c

0testeax,eax

0040b823 74 02jemain+67h (0040b827)

0040b825 eb d8jmpmain+3fh (0040b7ff)

除錯顯示,是在第四行0040b807 88

0a

movbyte ptr [edx],cl

出錯了,啊,好亂啊。

改用bcb6試試吧,**原封不動拷過去。

通過了,結果顯示,確實是在拷貝字串

看看彙編**

mov ecx,[ebp-0x04]

inc dword ptr [ebp-0x04]

mov al,[ecx]

mov edx ,[ebp-0x08]

inc dword ptr [ebp-0x08]

mov [edx],al

test al,al

jnz -0x14

結論:嗯,原來跳出迴圈的條件就是*s的值,字串以0結尾,在沒到s的末尾之前,就一直在向t中拷貝字元,哈哈,明白了(不過寫這樣的程式會不會被老闆開除啊?)。

看到bcb編譯的簡潔而易懂,語句也少很多。

而vc編譯的可真夠拖沓的,而且難懂(也許我不懂優化?也許吧)。

最後想想bcb輸給了vc,從這個小例子上,真讓人感到遺憾。zz

無聊做了乙個SQL SERVER的測試

測試 declare i int set i 3 print getdate while i 10000000 begin insert eb repair re id re code value re cd satisfition no re list no re in list date re ...

今天做了乙個題,記錄一下

題幹 程式設計 二選一 連續數字 分值 300 程式執行時限 600 ms 你的弟弟在紙上寫了一些連續的整數,這些整數是亂序排列的,且每個整數只出現一次。淘氣的弟弟把其中的乙個整數擦掉了,你現在需要寫程式找出他擦掉的是哪個數。輸入 只有一行,用逗號分隔的若干個整數 輸入約束 至少1個,至多50個整數...

乙個有趣的測試,相當神奇!

沒人逃得過的超準思維定向測試 切記要慢慢,請不要第一次就看完了全部!一定要慢慢的往下看!這樣你才能真 的體會到真的很很詭異的喔!請第一次看到這個測試的朋友,首先靜下心來,認真的,快速的用自己的心算來 坐下面這個測試,看清楚要求,真實的說出當時的第乙個腦子裡面的答案,才能看出這 個測試的最有效的結果!...