A" - " while循环函数中的operator

时间:2016-04-27 22:04:04

标签: c iar

我在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循环,第二个将正常工作。 " Ready" bool设置在另一个线程中。第一个循环将返回false,第二个循环将通过,因此Ready未设置为true。

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

编辑添加到功能:

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

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

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

仍然失败,它必须是IAR编译器没有正确读取i--并且需要从while函数中删除 - 操作。让我知道,如果你们还有其他我可以尝试的东西,但我对结束这个问题充满信心。

3 个答案:

答案 0 :(得分:1)

您将减少后递减操作符与预递减操作符混淆。这两个运营商是不同的。 i----i都会减少i。但他们的价值观是不同的。后递减运算符i--的值是i值。预递减运算符--i的值是i new 值。

答案 1 :(得分:1)

您的第一个代码:

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的比较不同。

答案 2 :(得分:0)

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