【问题标题】:A "--" operator in while loop functionwhile 循环函数中的“--”运算符
【发布时间】:2016-04-28 08:09:20
【问题描述】:

我在 IAR 编译器上使用 C 语言进行编码,并且有两个 while 循环:

i= 5;
do {
    Task_sleep(1000);
}while(i-- && !Ready);

if (!Ready)
   {
      dprint("No ready response!");
      return false;
   }

i= 5;
do {

    Task_sleep(1000);
    i--;
}while(i > 0 && !Ready);

if (!Ready)
       {
          dprint("No ready response!");
          return false;
       }

第一个将跳过 while 循环,第二个可以正常工作。 “就绪”布尔值设置在另一个线程中。第一个循环将返回 false,第二个循环将通过,因此 Ready 未设置为 true。

我认为编译器暂时不知道如何处理 i-- 并将其设置为 false。还有其他可能发生的事情吗?使用我的设置,我无法在调试中单步执行代码。

编辑添加到功能:

if(!Ready)
{
 dprint("No Ready responce!");
return false;
}

Tested Ready 为 volatile,--i 而不是 i--,并删除 Ready。都失败了。测试:

}while(((i--) > 0) && !Ready);

仍然失败,它必须是 IAR 编译器没有正确读取 i-- 并且需要从 while 函数中删除 -- 操作。如果你们还有什么我可以尝试的,请告诉我,但我有信心结束这个问题。

【问题讨论】:

  • 在第一个中,您没有将您的i-- 与任何东西进行比较,为了匹配第二个,不应该是while(i-- > 0 && !Ready)吗?
  • @gmiley 嗯?不是隐含的吗?
  • @gmiley:没有。就while 而言,i-- 的计算结果为true(当i != 0)或false(当i = 0)——两者都在实际递减之前检查。
  • 一个do 循环总是至少执行一次......你是说你甚至没有得到一个Task_sleep() 第一个循环?
  • Ready 变量是 volatile 变量吗?如果没有,编译器可能会将其短路。

标签: c iar


【解决方案1】:

您将后减量与减量前运算符混淆了。两个运算符不同。 i----i 都将减少 i。但他们的价值观不同。后减运算符i-- 的值是i 值。预减运算符--i的值是inew值。

【讨论】:

  • 我不知道 OP 所说的“第一个将跳过 while 循环”是什么意思,但是如果 i 从 5 开始,无论后/前减量如何,他都应该得到一些循环使用的运算符。当然循环也依赖于Ready...
  • 大约 3 秒后“就绪”设置为真。在第一个循环中,它看起来等待 1 秒然后继续运行。在第二个循环中,它等待 3 秒,然后继续前进。 “Ready”在第一个函数中设置为 false,导致它稍后在线程中失败。
【解决方案2】:

你的第一个代码:

do {
    Task_sleep(1000);
}while(i-- && !Ready);

相当于这个:

int condition;
TOP:
Task_sleep(1000);
condition = (i != 0 && !Ready);
i = i - 1;
if (condition)
    goto TOP

您的第二个代码:

do {

    Task_sleep(1000);
    i--;
}while(i > 0 && !Ready);

等价于:

int condition;
TOP:
Task_sleep(1000);
i = i - 1;
condition = (i > 0 && !Ready);
if (condition) goto TOP;

循环不同。 i 在相对于条件评估时间不同的时间递减,并且在条件内对i 的比较是不同的。

【讨论】:

    【解决方案3】:

    也许您可以尝试在第一个版本中使用volatile 关键字来限定变量i。上周我遇到了类似的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 2018-07-12
      • 1970-01-01
      相关资源
      最近更新 更多