導航:首頁 > 源碼編譯 > 編譯器優化後的無限循環

編譯器優化後的無限循環

發布時間:2022-02-28 16:30:41

1. 用DEV編譯器編譯後,為什麼循環報錯啊,求解答

for循環基本格式如下:
for ( e1 ; e2 ; e3 ) //這里括弧中的分號,至少要有兩個,你程序問題就出在這里
{
}
括弧中的e1,e2,e3表達式都可以不輸入(根據程序情況確定), 如:for( ; ; ) 表示一個for死循環
e1是初始化,只執行一次
e2是判斷結束條件,當e2為真時,循環,為假則跳出循環
e3是循環變數變化區,每循環一次都會執行一次這里的操作。

另:
1、你的printf("%d", n );寫到了continue;之後,而且在同一個{}中,這樣,你的程序運行起來就會是什麼顯示都沒有!
2、devC++不會自動暫停輸出顯示,為了看清楚屏幕輸出結果,請在return 0;之前加一個:system("pause"); //暫停一下

2. 如何防止因編譯器開啟優化,而導致程序執行錯誤

我的經驗是:未優化的c程序可正常運行,優化後不能運行,那一定是我的程序有問題。我還沒經歷過不是我程序的情況。
發現這種不易發現的問題,需要看匯編碼。
避免的方法,我的經驗:寫c程序,盡量規矩;似是而非的概念,一定要搞清楚,別僥幸。因為僥幸而留的雷,現在不出問題,將來一定會出問題;不優化不出問題,優化就出問題。
最後要說,每個應用程序,都讓他開優化運行,只要時間允許,一定要查出開優化後出問題的原因。時間不允許,只能不開優化湊合著,在有時間的時候繼續查問題。

3. 為什麼程序會無限循環

EOF 其實是一個宏,在預編譯期間會被編譯器用 -1 代替
也就是說,當scanf 的返回值是 -1 時就會跳出循環。
scanf 的返回值是前 N 個成功度取得數據的數量,簡單點說就是成功讀了多少個數據,不過有區別,如果你第一個輸入數據非法的話,就算你後面是合法輸入,也會返回 0 。
EOF 是 end of file 的意思,也就是文件尾。如果是讀文件的話,讀到文件尾就會結束循環。
如果使用鍵盤輸入的話, 輸入 Ctrl + z 就可以結束循環(貌似是模擬文件結束符還是什麼的,我也不太清楚),不過我所說的是在windows 環境下,如果是其他操作系統就另當別論了。
印象中,以前在網路 scanf()=EOF 看到過一篇文章就是這么講的

4. C#的問題 我感覺是編譯器優化的時候優化出問題來了

第1段代碼,當循環到 i=len-2 時,進行 if 段,這時在 if 段內要求: i++,那麼這時候 i=len-1 了。然後進入下一輪循環,這時因為 i==len-1 就進入 else 部份了。

第2段代碼,同樣,當循環到 i=len-2 時,同樣在 if 段內 i++ 造成 i=len-1,這時再往下走,走到
if(i==len-1) ,判斷就為true,就break了。

5. 在不考慮編譯器優化等因素下,下面那個運算比較快

下面是在編譯器不優化的情況下的代碼反匯編後的結果
14: if (a > b)//我們看到,只有3條指令,
0040104D mov edx,dword ptr [ebp-4] //將a放入寄存器EDX
00401050 cmp edx,dword ptr [ebp-8] //比較EDX和b的大小
00401053 jle main+3Ch (0040105c) //如果a<b跳轉到0040105c
15: {
16: return 1;
00401055 mov eax,1
0040105A jmp main+4Fh (0040106f)
17: }
18: if (a - b > 0)//我們看到有4條指令
0040105C mov eax,dword ptr [ebp-4]//將a放入EAX
0040105F sub eax,dword ptr [ebp-8]//a-b的差放入EAX
00401062 test eax,eax//比較EAX是否為0
00401064 jle main+4Dh (0040106d)//條件跳轉
19: {
20: return 2;
00401066 mov eax,2
0040106B jmp main+4Fh (0040106f)
21: }
所以我認為if (a > b) {....}
效率更高

6. C語言中,如果編譯的程序是無限循環的,系統會如何處理

一直運行啊,如下:
main()
{
int i=1 ;
while(i>0)
printf("死循環\n");
}
就是一直運行,CPU應付這點點循環還搓搓有餘。。。
不過有的會報錯,

7. 多面體模型是編譯器循環優化的未來嗎

我們可以依賴現代編譯器的優化技術而不是使用語言特性...編譯/鏈接/調試 的開發模型將會被繼承下來,但是把 ...『;』的)循環體 賦值語句不會返回布爾類型的結果 ...

8. java編譯器對於循環進行了真正的編譯優化嗎

不能用完全解釋語言過程來理解Java,v.size()在循環中並沒有被調用10000次,因為,編譯的循環優化會對其進行優化。

9. java這段代碼通過編譯,但無限循環

for(intj=1;j<=i;i++){
System.out.print("*");
}

能不無限循環么,你的j始終比i小

10. 嵌入式C常見三種無限循環的區別

我是剛剛上大學才學的編程,根據我的理解,我覺得for和while很好區別,for就是單一的循環,而while要根據括弧里的條件判定,才會進行循環。對於while和do while的區別,我覺得應該是while要先判斷是否滿足條件,才會執行後面的代碼,而do while要先執行do裡面的東西,再進行判定。

閱讀全文

與編譯器優化後的無限循環相關的資料

熱點內容
程序員考試考什麼科目 瀏覽:483
程序員必備文檔編輯 瀏覽:958
踩水果解壓大全 瀏覽:632
什麼是dk伺服器在 瀏覽:459
nusoapphp下載 瀏覽:927
黑莓原生解壓rar 瀏覽:954
百度解壓縮在哪 瀏覽:786
硬解壓卡怎麼用 瀏覽:181
新買的聯想伺服器怎麼配置 瀏覽:755
mc命令方塊的代碼 瀏覽:650
伺服器老打不開怎麼辦 瀏覽:254
單片機智能儀器 瀏覽:706
別告訴我你會記筆記pdf 瀏覽:159
一套谷歌51瀏覽器易源碼 瀏覽:377
unix安裝命令 瀏覽:57
cephmonitor源碼 瀏覽:439
單片機的硬體結構重點 瀏覽:557
地鐵逃生用什麼伺服器最好 瀏覽:930
租用雲伺服器怎麼樣 瀏覽:440
app上訴通訊錄有什麼後果 瀏覽:515