【问题标题】:Performance difference in for loop condition?for循环条件的性能差异?
【发布时间】:2010-11-08 20:34:50
【问题描述】:

我有一个简单的问题,主要是出于好奇。

这两行代码有什么区别? (在 C++ 中)

for(int i = 0; i < N, N > 0; i++)

for(int i = 0; i < N && N > 0; i++)

条件的选择完全是任意的,我只对 , 和 && 之间的区别感兴趣。

无论如何我都不是编码的初学者,但我从不为逗号操作符烦恼。

有性能/行为差异还是纯粹的审美差异?

最后一点,我知道有比条件运算符更大的性能鱼,但我只是好奇。放纵我。

编辑 感谢您的回答。

事实证明,提示这个问题的代码以我所描述的方式滥用了逗号运算符。我想知道有什么区别以及为什么它不是 && 运算符,但它只是写错了。我不认为它有什么问题,因为它工作得很好。谢谢你帮我理顺。

【问题讨论】:

  • 他没有说他很担心——只是好奇。我真的希望人们在每次有人“只想知道”时停止挥舞“过早优化”的旗帜。好奇心是一件好事
  • 我想知道如果 SO 实施一个过滤器可以节省多少时间,每当有人在问题中提到“性能”或“更快”等词时,就会自动发布一条评论说,“你'不允许考虑这个,公民,现在回去工作';-)
  • “过早引用 Knuth 是许多其他邪恶的根源。” -- 我
  • “过早做任何事情都是邪恶的,这就是过早的定义:)”——我
  • 你不是唯一一个不用逗号操作符的人,它只是不是很有用。正如您刚刚发现的那样,它可能会导致错误。我唯一一次使用它是在 for 循环的第一个或第三个表达式中,同时初始化或增加两个变量。

标签: c++ loops logical-operators comma-operator


【解决方案1】:

虽然看起来像,

for(int i = 0; i < N, N > 0; i++)

for(int i = 0; i < N && N > 0; i++) 

不等价。

这是证据。

int main(int argc, char* argv[])
{
  int N = 10;
  int i = 5;

  int val = (N, i);
  cout << val << endl;
}

结果:

5

这意味着当确定循环何时退出时,它将使用N &gt; 0。 如果N = 10,则表示永远为真,循环永远不会退出。

运行它并查看证明。

int main(int argc, char* argv[])
{
  int N = 10;
  int i = 5;

  for(int i = 0; i < N, N > 0; i++){
     cout << val << endl;
  }
}

bash-2.05$ ./a.out                  
0                                   
1                                   
2                                   
3                                   
4                                   
5                                   
6                                   
7                                   
8                                   
9                                   
10                                  
11                                  
...
142
143
144
145
146
147
148
^C

如果 N 是一个在循环内不变的常量或变量 那么你可以先检查一次来删除N &gt; 0检查,即

if (N > 0){
  for (int i = 0; i < N; i++)
   ...
}

【讨论】:

  • 我不知道为什么没有人投票赞成。当我要求解释时,我喜欢经过深思熟虑和详细的回答。谢谢
  • 我不会投票,因为它没有明确说明差异,并试图通过实验确定含义,而不是查看标准或任何文档。
  • 我个人喜欢例子和实验。 RichieHindle 的回答简短而准确,但描述性不是很强,也没有回答我的问题,实际区别是什么。即使这个答案没有详细说明问题背后的原因,它确实回答了这个问题。
  • 当标准说“应该”做 X 但实际上做 Y 时,你会怎么做?编译器也可能有错误!通过实验演示显示了差异。
  • 首先阅读标准和其他文档,然后测试特定的实现。无论如何,这是我的排名。如果编译器有 bug,那么至少你知道它是一个 bug,并且如果它在未来得到修复也不会感到惊讶。
【解决方案2】:

使用这样的逗号只会放弃第一个条件

逗号运算符的意思是“按此顺序运行这些语句,并取最后一个的值”。

【讨论】:

  • 因为它完全忽略它并且不执行检查?
  • i &lt; N, N &gt; 0”的值与“N &gt; 0”的值相同。
  • @Victor:它比较 i 和 N,丢弃结果,然后比较 N 和 0 并使用结果来决定是否继续循环。在优化的代码中,它可能不会费心比较 i 和 N。
  • 会进行比较,但结果会被丢弃。
猜你喜欢
  • 2016-09-07
  • 2010-11-13
  • 2020-09-04
  • 1970-01-01
  • 2010-09-20
  • 2016-06-02
  • 2014-01-11
  • 1970-01-01
相关资源
最近更新 更多