for循环中出现意外行为

时间:2016-11-02 21:15:45

标签: c++

这会编译并运行,但会为" 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;
}

编辑: 尽管另一个问题有一个同样有效的答案,但我觉得这个问题是不同的。我无法找到基于语义的各种措辞,我想知道它为什么不能用c ++工作,而不是如何使输出工作。

1 个答案:

答案 0 :(得分:4)

逗号运算符表示执行左侧的表达式然后执行右侧的表达式:

  a, b=0

首先执行a,它不执行任何操作,然后执行b=0,为b分配零。

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

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