C語言中文網 目錄

for循環及其注意事項,C語言使用for循環的注意事項總結

C 語言 for 循環語句的一般形式為:

for (<初始化>;<條件表達式>;<增量>)
{
    循環體語句;
}

一般情況下,初始化總是一個賦值語句,它用來為循環控制變量賦初值;條件表達式則是一個關系表達式,它決定什么時候退出循環;而增量定義循環控制變量每循環一次后按什么方式變化。這三個部分之間用分號“;”分割開來。

盡量使循環控制變量的取值采用半開半閉區間寫法

從功能上看,雖然半開半閉區間寫法和閉區間寫法的功能是完全相同的,但相比之下,半開半閉區間寫法更能夠直觀地表達意思,具有更高的可讀性。下面,我們就通過示例代碼看看兩者之間的區別。

其中,閉區間的寫法示例如下面的代碼所示:
for(i=0;i<=n-1;i++)
{
    /*處理代碼*/
}
在上面的代碼中,i 值屬于閉區間寫法。

半開半閉區間的寫法示例如下面的代碼所示:
for(i=0;i<n;i++)
{
    /*處理代碼*/
}
在上面的代碼中,i 值屬于半開半閉區間寫法,即“0=<i<n”,起點到終點的間隔為 n,循環次數為 n。

從上面的兩段示例代碼中可以看出,盡管它們的功能是完全相同的,但相比之下,第二個程序示例(半開半閉區間寫法)具有更高的可讀性。因此,在 for 循環中,我們應該盡量使循環控制變量的取值采用半開半閉區間寫法。

盡量使循環體內工作量達到最小化

我們知道,for 循環隨著循環次數的增加,會加大對系統資源的消耗。如果你寫的一個循環體內的代碼相當耗費資源,或者代碼行數眾多(一般來說循環體內的代碼不要超過 20 行),甚至超過一顯示屏,那么這樣的程序不僅可讀性不高,而且還會讓你的程序的運行效率大大降低。這個時候,我們通常可以通過如下兩種方法進行優化。

1) 重新設計這個循環,確認這些操作是否都必須放在這個循環里,并仔細考慮循環體內的語句是否可以放在循環體之外,從而使循環體內工作量最小化,提高程序的時間效率。如下面的示例代碼所示:
for (i = 0;i < n;i++)
{
    tmp += i;
    sum = tmp;
}
很顯然,在上面的代碼中每執行一次 for 循環,就要執行一次“sum=tmp”語句來重新為變量 sum 進行賦值,這樣的寫法很浪費資源。因此,我們完全可以將“sum=tmp”語句放在 for 語句之后,如下面的示例代碼所示:
for (i = 0;i < n;i++)
{
    tmp += i;
}
sum = tmp;
這樣,“sum=tmp”語句只執行一次,不僅可以提高程序執行效率,而且程序也具有更高的可讀性。

2) 可以考慮將這些代碼改寫成一個子函數,在循環中只調用這個子函數即可。

避免在循環體內修改循環變量

在 for 循環語句中,我們應該嚴格避免在循環體內修改循環變量,否則很有可能導致循環失去控制,從而使程序執行違背我們的原意,如下面的示例代碼所示:
for(i=0;i<10;i++)
{
    i=10;
}
在上面的代碼中,在循環體內對循環變量i進行賦值之后,for 循環中止執行,從而使程序執行違背我們的原意,更嚴重的情況會給程序帶來災難性的后果。

盡量使邏輯判斷語句置于循環語句外層

一般情況下,我們應該盡量避免在程序的循環體內包含邏輯判斷語句。當循環體內不得已而存在邏輯判斷語句,并且循環次數很大時,我們應該盡量想辦法將邏輯判斷語句移到循環語句的外層,從而使程序減少執行邏輯判斷語句的次數,提高程序的執行效率。如下面的示例代碼所示:
for (i = 0;i < n;i++)
{
    if (condition)
    {
            DoSomething();
    }
    else
    {
            DoOtherthing();
    }
}
在上面的代碼中,每執行一次 for 循環,都要執行一次 if 語句判斷。當 for 循環的次數很大時,執行多余的判斷不僅會消耗系統的資源,而且會打斷循環“流水線”作業,使得編譯器不能對循環進行優化處理,降低程序的執行效率。因此,我們可以通過將邏輯判斷語句移到循環語句的外層的方法來減少判斷的次數,如下面的代碼所示:
if (condition)
{
    for (i = 0;i < n;i++)
    {
            DoSomething();
    }
}
else
{
    for (i = 0;i < n;i++)
    {
            DoOtherthing();
    }
}
雖然上面的代碼沒有前面的看起來簡潔,但卻使程序執行邏輯判斷語句減少 n-1 次,在 for 循環次數很大時,這種優化顯然是值得的。

最后還需要注意的是,循環體中的判斷語句是否可以移到循環體外,要視程序的具體情況而定。一般情況下,與循環變量無關的判斷語句可以移到循環體外,而有關的則不可以。

盡量將多重循環中最長的循環放在最內層,最短的循環放在最外層

在多重 for 循環中,如果有可能,應當盡量將最長的循環放在最內層,最短的循環放在最外層,以減少 CPU 跨切循環層的次數。如下面的示例代碼所示:
for (i=0;i<100;i++)
{
    for (j=0;j<5;j++)
    {
            /*處理代碼*/
    }
}
為了提高上面代碼的執行效率,我們可以依照這條建議將上面的代碼修改為如下形式:
for (j=0;j<5;j++)
{
    for (i=0;i<100;i++)
    {
            /*處理代碼*/
    }
}
這樣,既不會失去程序原有的可讀性,同時也提高了程序的執行效率。

盡量將循環嵌套控制在 3 層以內

有研究數據表明,當循環嵌套超過 3 層,程序員對循環的理解能力會極大地降低。同時,這樣程序的執行效率也會很低。因此,如果代碼循環嵌套超過 3 層,建議重新設計循環或將循環內的代碼改寫成一個子函數。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo