循环条件的性能差异?

Cod*_*ile 7 c++ loops comma-operator logical-operators

我有一个简单的问题,我主要是因为我的好奇.

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

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

for(int i = 0; i < N && N > 0; i++)
Run Code Online (Sandbox Code Playgroud)

条件的选择是完全随意的,我只是对&和之间的差异感兴趣.

我不是任何编码的初学者,但我从未打扰过逗号运算符.

是否有性能/行为差异或纯粹是美学?

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

编辑 感谢您的回答.

事实证明,提示这个问题的代码以我描述的方式滥用了逗号运算符.我想知道区别是什么以及为什么它不是&&运算符,但它只是写得不正确.我觉得它没有任何问题,因为它运作得很好.谢谢你把我拉直了.

Ric*_*dle 33

使用这样的逗号将简单地丢弃第一个条件.

逗号运算符表示"按此顺序运行这些语句,并获取最后一个语句的值".

  • "i <N,N> 0"的值与"N> 0"的值相同. (2认同)

Mat*_*att 10

虽然它看起来像,

for(int i = 0; i < N, N > 0; i++)
Run Code Online (Sandbox Code Playgroud)

for(int i = 0; i < N && N > 0; i++) 
Run Code Online (Sandbox Code Playgroud)

不等同.

这是证明.

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

  int val = (N, i);
  cout << val << endl;
}
Run Code Online (Sandbox Code Playgroud)

结果:

5
Run Code Online (Sandbox Code Playgroud)

这意味着在确定循环何时退出时将使用N > 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;
  }
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

如果N是一个在循环内没有变化的常量或变量,那么你可以N > 0通过先检查它来删除检查,即

if (N > 0){
  for (int i = 0; i < N; i++)
   ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我不会投票,因为它没有明确说明差异,并试图通过实验确定含义,而不是查看标准或任何文档. (3认同)