7

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

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

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

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

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

无论如何,我都不是编码的初学者,但我从来没有打扰过逗号运算符。

是否存在性能/行为差异或纯粹是审美差异?

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

编辑 感谢您的回答。

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

4

2 回答 2

33

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

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

于 2009-07-07T21:15:44.860 回答
10

虽然看起来很像,

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 > 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 > 0通过先检查一次来删除检查,即

if (N > 0){
  for (int i = 0; i < N; i++)
   ...
}
于 2009-07-08T05:19:13.363 回答