如果我想使用他们的新值,我知道i ++和++ i之间的区别(如this)。我在C语言程序设计语言(K& R)中看到了很多使用像s[i++] = c;
这样的表达式的例子。有时,我遇到的代码(如下所示)让我感到困惑,这种风格似乎被他们高度评价。
while (*string1++ = *string2++); //in c
在这个post中,Jon'避免使用'这种风格。
所以我的问题是使用像上面代码这样的i ++(或++ i)一个好习惯吗?如果没有,我应该在哪种情况下使用它(就在我不使用新阀门时?)
答案 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是正确的(像往常一样),它可以使你的代码更难理解:精神上区分++i
和i++
是你的大脑必须经历的另一个循环来理解发生了什么事。
在某些情况下,代码中的粒度更符合您的要求;有时你不在乎。实际上没有任何严格的规则。
当然,话虽如此,我个人建议不要使用i++
或++i
作为函数参数(即foo(i++)
),因为这会引入一些非常难以跟踪的内容如果你不是很小心,或者把它们与其他操作员混在一起就会出错(比如Bryan Chen的i++ + k++
的例子)。