【发布时间】:2011-06-23 06:33:30
【问题描述】:
在 Objective-C 中,n++ 和 ++n 之间有什么区别(例如,在 for 循环中使用)?
【问题讨论】:
标签: objective-c operator-keyword increment
在 Objective-C 中,n++ 和 ++n 之间有什么区别(例如,在 for 循环中使用)?
【问题讨论】:
标签: objective-c operator-keyword increment
++n; 增加n 的值在表达式被计算之前。
n++; 增加n 的值在表达式被计算之后。
所以比较一下这个结果
int n = 41;
int o = ++n; //n = 42, o = 42
结果如下:
int n = 41;
int o = n++; //n = 42, o = 41
在循环的情况下:
for (int i = 0; i < j; i++) {/*...*/}
但它没有任何区别,除非你有这样的东西:
for (int i = 0; i < j; x = i++) {/*...*/}
或者这个:
for (int i = 0; i < j; x = ++i) {/*...*/}
有人会说:
使用
n++或++n无关紧要,只要在同一个表达式中没有修改(基于n)第二个(相关)变量。
同样的规则显然适用于--n; 和n--;。
【讨论】:
++n 在使用前递增值(预递增),n++ 在使用后递增(后递增)。
在 for 循环的上下文中,没有可观察到的区别,因为在循环中的代码执行之后应用了增量。
【讨论】:
++n 和 n++ 在表达式的计算结果上有所不同。一个例子:
int n = 0;
NSLog(@"%d", n); // 0
NSLog(@"%d", n++); // still 0, increments afterwards
NSLog(@"%d", n); // 1
NSLog(@"%d", ++n); // 2, because it increments first
NSLog(@"%d", n); // 2
【讨论】:
在循环中它不会有所作为。有人说++n 更快
【讨论】:
在 Scott Meyers “更有效的 C++” 一书中,他提出了一个非常合理的案例,即更喜欢前缀增量而不是后缀增量。简而言之,在那种语言中,由于运算符重载设施前缀增量几乎总是更快。 Objective C 不支持重载运算符,但如果你已经或曾经做过任何 C++ 或 Objective-C++ 编程,那么首选前缀递增是一个很好的习惯。
请记住,大多数时候 ++n 看起来像:
n = n + 1 [对 n 做某事]而 n++ 看起来像(如果按预期使用):
寄存器 A = n; //复制n [对 n 做某事] n = A + 1;如您所见,后缀案例有更多说明。在简单的 for 循环中,如果很明显不会使用预增量 n 但这种情况会转移到前缀情况,则大多数编译器都足够聪明,可以避免复制。
我希望这是有道理的。总之,您应该使用前缀,除非您真的想要评估的“副作用”行为,然后增加您从后缀版本中获得的值。
【讨论】:
如上所述,
--n 在计算表达式之前递减 n 的值。
n--; 在计算表达式后减小 n 的值。
这里要注意的是使用while循环时
例如:
n = 5
while(n--) #Runs the loop 5 times
while(--n) #Runs the loop 4 times
和 n 一样——当 n = 1 时,循环运行额外的时间 但是在 --n 1 中,首先减为 0,然后进行评估。这会导致 while 循环中断。
【讨论】: