使用i ++(或++ i)真的是一个好习惯吗?

时间:2014-06-30 03:15:09

标签: c post-increment pre-increment

如果我想使用他们的新值,我知道i ++和++ i之间的区别(如this)。我在C语言程序设计语言(K& R)中看到了很多使用像s[i++] = c;这样的表达式的例子。有时,我遇到的代码(如下所示)让我感到困惑,这种风格似乎被他们高度评价。

while (*string1++ = *string2++); //in c

在这个post中,Jon'避免使用'这种风格。

所以我的问题是使用像上面代码这样的i ++(或++ i)一个好习惯吗?如果没有,我应该在哪种情况下使用它(就在我不使用新阀门时?)

2 个答案:

答案 0 :(得分:2)

对于增量变量的想法,i ++本身就是一个明确的,惯用的表达式。就其本身而言,它是如此清晰。计算机语言以这个成语(C ++)命名。

乔恩并没有说要避免" i ++&#34 ;;他说要避免将它与其他会使事情复杂化的表达结合起来,其中增量操作是一种副作用"。像:

arr2[++j] = arr[++i];   // now what the heck is going on? I have to stop and look.

在这种情况下,避免它更合理,我同意他的观点。当你开始调整代码,移动东西或添加逻辑时,增量可能会消失,移动,变得多余等等。通常最好在一行上执行增量,或者在循环头中执行增量。

关于++运算符的有趣之处,除了它是一个天才的想法之外,前缀和后缀替代编码不仅仅是" i = i + 1",它们编码额外的评估可以这么说,任务的左侧或右侧。 (或者您可以将其视为评估前/后)。

所以++ i在功能上是:

i = i + 1; return i

和i ++在功能上是:

temp = i; i = i + 1; return temp

这种差异导致额外的麻烦"通过隐藏错误,您可以看到为什么,如果编译器没有优化生成的代码,它们会有不同的性能分支。

答案 1 :(得分:0)

这似乎主要是个人风格和情况要求。

i++i+=1相比,写i=i+1更简洁,它可以帮助您删除无法传达算法基本事实的代码行。< / p>

当然,Jon Skeet是正确的(像往常一样),它可以使你的代码更难理解:精神上区分++ii++是你的大脑必须经历的另一个循环来理解发生了什么事。

在某些情况下,代码中的粒度更符合您的要求;有时你不在乎。实际上没有任何严格的规则。

当然,话虽如此,我个人建议不要使用i++++i作为函数参数(即foo(i++)),因为这会引入一些非常难以跟踪的内容如果你不是很小心,或者把它们与其他操作员混在一起就会出错(比如Bryan Chen的i++ + k++的例子)。