【问题标题】:Decrease varibale until a condition is met (in bodyless while loop )减少变量直到满足条件(在无体的while循环中)
【发布时间】:2015-09-03 14:59:18
【问题描述】:

我正在寻找这样的东西:

int nVal = 130;
while(nVal % 6 != 0)
  nVal--;

在没有正文的while循环中:

int nVal = 130;
while(nVal-- % 6 != 0)

当然,那样的话,-- 操作符被调用一次太频繁了。 这里有什么建议还是我应该选择选项#1?

【问题讨论】:

  • while(--nVal % 6 != 0).. 但是为什么呢? while-body 没什么问题。
  • 你为什么需要一个没有身体的while?专注于编写干净的代码,让编译器做这样的优化..
  • 这段代码相当于nVal=126。它是由一个好的编译器产生的。

标签: c while-loop


【解决方案1】:

使用第一个替代方案,因为它更清晰和正确。在一行中显示尽可能多的运算符绝不是一个好主意。尤其不是 ++-- 运算符,因为它们包含副作用,因此与其他运算符一起使用非常危险。

【讨论】:

    【解决方案2】:

    您可以这样做:while((nVal-- -1) % 6 != 0) 但是,正如伦丁所说,第一个例子更清楚

    【讨论】:

    • 确实是这样,但是@tzippy 想要一个无主体的 while 循环,所以我提供了
    【解决方案3】:

    优化后应该是asm中的相同代码。 使用 --nVal 代替 nVal 可能会更好,但我认为使用 -o3 并不重要。

    【讨论】:

    • 我认为在这种情况下优化器不会被允许为前缀/后缀生成相同的程序集,因为它们在语义上并不相同
    • 第二个选项即使条件计算为 0 也会减小值,因此它们不等价。
    • 如果优化器足够聪明,它将减少到nVal=126
    • @EugeneSh。在优化期间是否评估循环体?我认为这种事情通常不会做,因为在大多数情况下,代码无法在编译时进行评估
    • @awksp 你不能确定。优化器在这类事情上变得更好(更糟?)。他们甚至可以做一些奇怪的事情,比如this
    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2021-12-24
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多