【发布时间】:2020-07-16 14:27:41
【问题描述】:
我想知道这个过早且不太重要的事情。我写过:
m_playerIndex = ++m_playerIndex % 2 // always either 0 or 1 (int)
对于我的国际象棋游戏,确保其他玩家在刚刚完成的移动之后会执行下一步。但是它不太可读,是吗?
最重要的是,它将一个变量增加 1,然后在适配变量上调用 2 的模块运算符,这意味着我有这个临时变量,我将其分配给 m_playerIndex 并立即将其替换为 % 的结果2.什么是最有效的?是选项2、1,还是根本没有区别? (我还没有检查这些东西的程序。)
1)
m_playerIndex = ++m_playerIndex % 2
2)
m_playerIndex = (m_playerIndex + 1) % 2
【问题讨论】:
-
在 C 中,选项 1 是未定义的行为。 (从 C++17 开始,它在 C++ 中定义良好。但无论如何我都不会使用它,因为依赖于副作用顺序会给读者带来不必要的混淆。)
-
选项 2 好得多,因为它比选项 1 更清楚地传达了意图。另一个查看代码并看到选项 1 的程序员会感到困惑,因为它看起来像一个错误或疏忽。选项 1 需要注释以通知后续程序员(很可能是您未来的自己)代码不是错误并故意增加 m_playerIndex,然后丢弃该工作。另外,请相信优化器(他们很棒),并且程序的易读性。
-
m_playerIndex = !m_playerIndex;或m_playerIndex ^= 1;如果你想混淆代码。 -
不要问标记为 C 和 C++ 的问题,它们是不同的语言,需要不同的答案。
标签: c++ c performance