【问题标题】:Unexpected behaviour in a for loop [duplicate]for循环中的意外行为[重复]
【发布时间】:2016-11-02 21:15:45
【问题描述】:

这会编译并运行,但会为“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++ 语法——特别是逗号操作符不会像你认为的那样做。
  • 当然可以!但是,它的工作方式可能与您的预期不同。您希望该程序如何运作?
  • 对我有用,你期待什么输出?
  • @DaveB 为了迂腐,它对你不起作用,因为它包含未定义的行为。 a 变量未初始化。
  • @DaleWilson 好点,我应该说我得到了预期的输出。

标签: c++


【解决方案1】:

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

  a, b=0

首先执行a,它什么都不做,然后它执行b=0,它将零分配给b。

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

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

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2013-01-28
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多