2016-11-02 69 views
-2

这编译并运行,但为“a”生成垃圾值。为什么“a”不像“b”那样增量?为什么会产生垃圾?for循环中的意外行为

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++中工作,而不是如何使输出工作。

+3

你需要学习C++的语法 - 特别是逗号运算符不会做你认为它的做法 –

+0

当然,它的工作原理!然而,它可能以一种与你期望的不同的方式工作。工作吗? – CiaPan

+1

对我有用,你期待什么输出? – DaveB

回答

4

逗号操作符说,执行表达式左侧则执行右边的表达式:

a, b=0 

首先执行a它什么都不做的话,就执行b=0其分配零到B。

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

它也提供了一个序列点,告诉编译器“在右边的任何事情发生之前,左边的所有东西都必须完整,这限制了编译器允许的优化,例如a + = 1,b = a + c [a]在将它用作索引之前总是加1,因此b = ++ a + c [a]之类的东西是未定义的,因为编译器可以在将它用作索引之前或之后增加a。