【问题标题】:Difference in output of i=i++ + ++c; and i=++i + c++; [duplicate]i=i++ + ++c 的输出差异;和 i=++i + c++; [复制]
【发布时间】:2024-01-13 17:54:01
【问题描述】:

我不知道这是否是特定于编译器的,但是当我尝试在 DevC++

中运行这两个表达式时

i=c=b=0; i=i++ + ++c 给出2i=++i + c++ 给出1

但是 b=i++ + ++cb=++i + ++c 为这两个表达式生成结果 1

我知道根据 C 标准规范,在同一个表达式中将变量增加两次会导致未定义的值,但我很好奇编译器是如何产生这些输出的。有人可以解释一下如何以及为什么?

【问题讨论】:

  • 未定义的行为。 Demons may fly out of your nose。实际上,如果您没有将结果分配回i,这个问题会很有趣,这会导致未定义的行为。
  • @Fred Larson 在第二个例子中他不是有效的,但第一个是你提到的未定义
  • @Jesus:我看到两者都分配给i,所以两者都是未定义的行为。赋值和增量之间没有序列点。
  • 他说 b=i++ + ++c 的地方有一个,这个和旁边的一样有效。
  • @grok12:不,可以在表达式中使用变量值后的任何时间执行后增量。未定义是在分配之前还是之后执行。

标签: c increment


【解决方案1】:

i++++i 完全不同,i++ 是后增量,这意味着在表达式中评估 i,然后在评估后递增。 ++i 表示递增然后计算表达式。 我在您的示例中看到您设置了i = ++i/i++,这是评论中提到的未定义行为。

【讨论】:

    【解决方案2】:

    i++ + ++cc 递增(到 1),然后0 + 1 存储在i,最后i 递增,得到2

    ++i + c++i 递增(到 1),然后1 + 0 存储在i 中,然后c 递增。

    这就是我理解编译器所做的事情的方式,但正如其他人所说,不要指望其他地方的这种行为。

    【讨论】:

      【解决方案3】:

      你确定 b = ++i + ++c = 1?还是 b = ++i + c++?这是我对你的问题的解释。

          i = i++ + ++c
          (i = 0 + 1)++
          i = 2
          c = 1
      
          i = ++i + c++
          (i = 1 + 0)
          i = 1
          c = 1
      

      【讨论】:

        【解决方案4】:

        C99 标准明确表示 (6.5, p2)

        在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。

        表达式i = ++i;i = i++; 都更新i 两次,这是不允许的。

        【讨论】: