如何在C++'for'循环中放置两个递增语句?

Pet*_*mit 84 c++ for-loop comma-operator

我想在for-loop条件中增加两个变量而不是一个.

所以类似于:

for (int i = 0; i != 5; ++i and ++j) 
    do_something(i, j);
Run Code Online (Sandbox Code Playgroud)

这是什么语法?

Pau*_*xon 143

一个常见的习惯用法是使用逗号运算符来计算两个操作数,并返回第二个操作数.从而:

for(int i = 0; i != 5; ++i,++j) 
    do_something(i,j);
Run Code Online (Sandbox Code Playgroud)

但它真的是一个逗号运算符吗?

现在写了这篇文章,一位评论者认为它在for语句中实际上是一些特殊的语法糖,而不是逗号运算符.我在GCC检查了如下:

int i=0;
int a=5;
int x=0;

for(i; i<5; x=i++,a++){
    printf("i=%d a=%d x=%d\n",i,a,x);
}
Run Code Online (Sandbox Code Playgroud)

我期待x拿起a的原始值,所以它应该显示为5,6,7 ..对于x.我得到的是这个

i=0 a=5 x=0
i=1 a=6 x=0
i=2 a=7 x=1
i=3 a=8 x=2
i=4 a=9 x=3
Run Code Online (Sandbox Code Playgroud)

但是,如果我将表达式放在括号中以强制解析器真正看到逗号运算符,我就会得到它

int main(){
    int i=0;
    int a=5;
    int x=0;

    for(i=0; i<5; x=(i++,a++)){
        printf("i=%d a=%d x=%d\n",i,a,x);
    }
}

i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8
Run Code Online (Sandbox Code Playgroud)

最初我认为这表明它根本不像一个逗号运算符,但事实证明,这只是一个优先问题 - 逗号运算符具有最低可能的优先级,因此表达式x = i ++,a ++是有效的解析为(x = i ++),a ++

感谢所有的评论,这是一个有趣的学习经历,我已经使用C多年了!

  • 它*是该上下文中的逗号运算符.你没有得到你期望的原因是命令运算符的优先级低于赋值运算符,所以没有parantheses它解析为(x = i ++),j ++. (18认同)
  • 它是一个逗号运算符.赋值关系比逗号运算符强,因此x = i ++,a ++被解析(x = i ++),a ++而不是x =(i ++,a ++).某些图书馆误用了这个特征,因此v = 1,2,3; 做直观的事情,但只是因为v = 1返回一个代理对象,重载的逗号运算符对其进行追加. (5认同)
  • 好.从http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2857.pdf 6.5.3节开始,最后一部分是"表达式".(尽管1.6#2将"表达式列表"定义为"用逗号分隔的表达式列表",但此构造不会出现在6.5.3中.).这意味着当我们编写"++ i,++ j"时,它必须是一个单独的表达式,因此","*必须是逗号运算符*(5.18).(这不是"初始化者列表"或"函数参数列表",这是"逗号被赋予特殊含义"的例子,如5.18#2所述.).我发现它有点令人困惑. (3认同)

yey*_*man 54

试试这个

for(int i = 0; i != 5; ++i, ++j)
    do_something(i,j);
Run Code Online (Sandbox Code Playgroud)

  • +1你也可以在第一部分声明j.for(int i = 0,j = 0; i!= 5; ++ i,++ j){...} (17认同)

squ*_*art 6

尽量不要这样做!

来自http://www.research.att.com/~bs/JSF-AV-rules.pdf:

AV规则199
除了将单个循环参数更改为循环的下一个值之外,for循环中的增量表达式将不执行任何操作.

理由:可读性.

  • 这是事实,但公平地说,我很确定规则的标准是为战斗机中的嵌入式软件编写的,而不是花园式C(++)程序.话虽如此,它可能是一个很好的可读性习惯,而且谁知道,也许你会设计F-35软件,而且它将是一个不那么容易打破的习惯. (4认同)