2010-04-12 83 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 --;,你不需要做任何特别的事情,特别是如果它增加了代码的复杂性,而没有提供任何额外的语言功能适应。