2010-04-12 69 views
6

例如:C - 是否可以從for循環中減去for循環的最大值?

void decrement(int counter) { 
    counter--; 
} 

int counter = 20; 
for (int i = 0; i < counter; i++) { 
    for (int j = 0; j < counter, j++) { 
     decrement(counter); 
    } 
} 

理想,我想看到的是counter變種正在遞減一次for循環運行時間,所以它運行少於20次迭代。但gdb顯示在decrement()counter內遞減,但回到for循環counter實際上保持不變。

+0

是的,但是如果你打算這樣做的話,它會更像'while'循環。 – jamesdlin 2010-04-12 21:41:12

回答

9

是的,它是可能的:

for (int i = 0; i < counter; i++) { 
    counter--; 
} 

爲什麼它不會在你的榜樣工作的原因是因爲你是按值傳遞和修改值的副本。如果你傳遞一個指向變量的指針而不是僅僅傳遞該值,它就會工作。

+0

它有助於思考如何編譯:在每次迭代之前讀取和檢查計數器,因此循環內的修改只會改變該檢查。一種說服自己的方法是將其轉換爲while循環。 – WhirlWind 2010-04-12 21:31:41

5

您也可以use pointers所以值保持decrement功能之外被改變:

void decrement(int *counter) { 
    (*counter)--; 
} 

int counter = 20; 
for (int i = 0; i < counter; i++) { 
    for (int j = 0; j < counter; j++) { 
     decrement(&counter); 
    } 
} 

或者只是做counter--,而不是調用decrement功能。

+0

+1 - 很好的例子 – IAbstract 2010-04-12 21:40:56

1

正如馬克已經表明,它是可能的,但那些它的一個不這樣做

雖然你可以使用所有的迴路各種各樣的技巧性的東西,它不是最好的,如果你可以把它寫在更清晰的時尚。

保持代碼簡潔易懂,而不是代碼空間。代碼是供人閱讀,而不是關心它佔用多少空間。 (反正在一般情況下)

+0

+1!幾乎在任何語言中這都是不好的做法。正如其他人所說,如果一個人絕對需要這種邏輯,請使用while()。 – 2010-04-12 22:13:30

0

你所做的只是簡單的counter --;,你不需要做任何特別的事情,特別是如果它增加了代碼的複雜性,而沒有提供任何額外的語言功能適應。