for循环中的意外行为

Unexpected behaviour in a for loop

本文关键字:意外 循环 for      更新时间:2023-10-16

编译并运行,但为"a"生成垃圾值。为什么"a"不像"b"一样增加?为什么会产生垃圾?

for(a,b=0; a,b != 55; a,b++)
{
    //outputs garbage
    std::cout << "a = " << a << std::endl;
    //outputs expected results 
    std::cout << "b = " << b << std::endl;
}

逗号操作符表示执行左边的表达式然后执行右边的表达式:

  a, b=0

首先执行不执行任何操作的a,然后执行将0赋值给b的b=0

为什么存在逗号操作符?当表达式有副作用时,逗号操作符很有用。

还充当了一个序列点,告诉编译器"左边的所有内容必须在右边的任何内容发生之前完成"。这限制了编译器允许的优化,因此例如a += 1, b = a + c[a]总是在将a用作索引之前向a添加1。像b = ++a + c[a]这样的东西是未定义的,因为编译器可以在使用a作为索引之前或之后增加a。