Can`while(i!=0&;(a[i].p!=0|a[i].q!=0));`除了冷冻,你还要做什么吗? 我正在阅读别人的C++代码,我对下面这样的结构感到困惑: while (i != 0 && (a[i].p != 0 || a[i].q != 0));

Can`while(i!=0&;(a[i].p!=0|a[i].q!=0));`除了冷冻,你还要做什么吗? 我正在阅读别人的C++代码,我对下面这样的结构感到困惑: while (i != 0 && (a[i].p != 0 || a[i].q != 0));,c++,while-loop,infinite-loop,C++,While Loop,Infinite Loop,在哪里 i是一个无符号整数索引 a是一个具有structs的数组,其中包含整数成员p和q 注意while循环的主体是空的(分号)。还要注意的是,条件中没有递增/递减运算符或任何赋值 我不明白这条线怎么会有用。似乎只有两种情况: 条件不满足,循环立即退出 如果条件满足,循环将无限大,程序将永远冻结 有没有任何可以想象的情况下,这句话会有意义,即做一些不平凡的事情,也不会永远冻结 一些理论上可以想象但不太可能的“解决方案尝试”: 一些=,[],&&,|运算符以某种奇怪的意外方式被重写 该循环实

在哪里

  • i
    是一个无符号整数索引
  • a
    是一个具有
    struct
    s的数组,其中包含整数成员
    p
    q
注意while循环的主体是空的(分号)。还要注意的是,条件中没有递增/递减运算符或任何赋值

我不明白这条线怎么会有用。似乎只有两种情况:

  • 条件不满足,循环立即退出
  • 如果条件满足,循环将无限大,程序将永远冻结
  • 有没有任何可以想象的情况下,这句话会有意义,即做一些不平凡的事情,也不会永远冻结

    一些理论上可以想象但不太可能的“解决方案尝试”:

    • 一些
      =
      []
      &&
      |
      运算符以某种奇怪的意外方式被重写
    • 该循环实际上是一个“忙等待”循环,
      i
      a
      的内容从另一个线程更改,然后最终“泄漏”,因为内存模型不能保证在另一个线程中写入的内容不可见,即使没有任何适当的同步。但这看起来非常丑陋,所以请原谅我想到了这种可能性

    是否存在任何上下文,在这些上下文中,这一行可能变得有意义,或者这只是一些错误代码,一个永远不会满足的条件,应该重构为一个
    断言

    这是一个糟糕的代码,无论您如何看待它

    我可以看到两种可能的选择:

  • 程序员编写了一个bug
  • 它是多线程的,其中一个值将从另一个线程更改,并且程序员没有执行正确的线程同步
  • 你关于奇怪的操作符重载的建议是可能的,但是哇!这真的是一种延伸(而且是可怕的、可怕的编码实践,因为所使用的操作符都不应该有副作用)


    我猜:有人忘了增加i。

    “条件满足,循环变为无限,程序永远冻结。”不做任何重要事情的无限循环是未定义的行为。它们不一定永远循环。看。你确定所有的变量都是整数而不是原子的吗?好的,对不起大家。虚惊一场。问题是我不习惯缩进的方式。在
    while
    状态上方有100英里长的
    do{…}
    块,然后是断线。那太傻了。很抱歉。看起来像是“琐碎的打字错误”,或者只是不相关的代码缩进问题。@indstructable Hehe我总是被
    do
    /
    发现,而
    。听起来这个函数需要一些拆分@你应该找到它们并杀死它们。“忘记增加i”对
    i!=0
    。关于运算符重载的建议是不可能的。你不能只使用内置类型来重载运算符。也许那应该是减量i。谢谢你的回答,@JosephLarson,但我恐怕解释要简单得多:我只是错过了一个非常长且奇怪缩进的
    do{…}while(),在关闭
    }
    和有问题的
    while
    之间有太多的换行符。我也希望在某个地方有类似于
    I--
    的东西。现在不知道该怎么处理这个问题,它可能应该作为一个“微不足道的印刷错误”被关闭和删除。有时问其他程序员你的问题可以帮助你找到答案。我不知道有多少次我通过让别人和我一起看代码来解决自己的问题。