编码不好的做法?带&&amp ;;的条件下的预增量

时间:2013-12-24 04:07:11

标签: c++

在我的代码中我有

while (++num1begin >= 0 && isdigit(eq[num1begin]))

应增加num1begin,检查num1begin现在是否大于或等于零并检查其他条件。

这是不好的编码练习吗? (它确实在做我上面描述的吗?)

2 个答案:

答案 0 :(得分:4)

应避免在您的情况下产生副作用的任何事情,因为它会强迫读取此代码的人几次检查有效性。

换句话说,它很容易出错并且难以调试。如果您在ifwhile之前或之内增加变量,它的工作方式相同,但更容易理解。

答案 1 :(得分:2)

  

while(++ num1begin> = 0&& isdigit(eq [num1begin]))

所有个人偏好 - 恕我直言都没有错。我个人喜欢简洁 - 并且在屏幕上获得额外的上下文行 - 比之前的++num1begin更多......

对我来说,我本能地想要检查++num1begin >= 0逻辑 - 这需要花费一点力气,但是必须要做的是增量是在同一行还是在一行之前。 &&另一侧的评估和安全使用顺序不需要考虑/努力,但这会因读者而异。你应该总是考虑你的“观众”......如果其他程序员都是专业的C ++开发人员,他们应该对此很满意。如果他们不是,并且可能不得不停下来想知道短路评估和序列点,那么你可能想把它拆分出来。沉溺于代码维护者的最低共同点并不总是最好的......人们应该学习语言......但是不同的人群自然会遇到不同的代码库。

“我本能地想检查......” - num1begin用于索引eqisdigit()暗示是一个字符数组,所以我对此代码的关注包括:

  • num1begin是否为签名类型(因此第一个条件可能为假),
  • num1begin的{​​{1}}不是代码试图避免搜索的实际哨兵值(给定-1的标记和类型的最负值是常见的),
  • -1在每次循环迭代时都会被测试,但可能只是第一次需要,
  • 没有检查搜索num1begin >= 0 ....
  • 的结尾

对上述任何一项进行更正可能需要放弃当前的代码,但如果代码的功能正确且有效,那么我就可以了。