【问题标题】:C postincrement in conditionC 条件后增量
【发布时间】:2012-04-24 22:05:06
【问题描述】:
do {instructions...}
while (x--)

应该先做指令,然后检查x是否不是0并根据结果继续/或离开循环只有在所有这些操作减量后 x

但我的编译器先递减

谁错了?我或我的编译器;-)?你能解释一下为什么吗?

【问题讨论】:

  • 我认为它会进行检查然后递减,然后在循环中运行指令。这样做是有意义的,因为 x-- 在循环中的指令之前,但 -- 的优先级很低。
  • 你怎么知道? “检查 x 的值。离开循环。递减 x”与“检查 x 的值。递减 x。离开循环。”有何明显不同?你在看生成的汇编代码吗?

标签: c loops do-while post-increment


【解决方案1】:

你在说什么

应该先做指令,然后检查'x'是否不是'0'然后去 根据结果​​打开/或离开循环并且仅在所有这些之后 操作减量“x”

应该是什么

应该先做指令,然后检查'x'是否不是'0',然后 DECREMENT 'x' 并根据结果继续/或离开循环

【讨论】:

    【解决方案2】:

    C 中的许多表达式都有副作用

    对于表达式x--x之前的值;副作用是减少x 的值。

    所以,如果你以 x 为 1 开始,当执行到达该表达式时,它将产生 1 并将 x 设置为 0。下一次表达式被评估,0x设置为-1,...

    【讨论】:

    • 我不是特别喜欢吹毛求疵,但是x+110*34-6 的副作用是什么?
    • 甚至还有没有值的表达式:例如free(ptr)。这就是为什么我说(几乎)
    • 抱歉,我不清楚,我在争论“几乎”:我认为像 x < 10y + 1 这样的无副作用表达式至少与 x++--y,所以“几乎每个”可能应该是“许多”或“一些”。没关系:)
    • @dbaupp:您的建议改进了我原来的答案。谢谢。答案已编辑。
    【解决方案3】:

    流程是:

    1) 做指示

    2) 检查 x 的值

    3.1) 是 x == 0?然后执行 x-- (x 变为 -1) 并退出循环

    3.2) 是 x != 0?然后执行 x-- 并转到步骤 1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 2012-06-01
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      相关资源
      最近更新 更多