我在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函数中删除 - 操作。让我知道,如果你们还有其他我可以尝试的东西,但我对结束这个问题充满信心。
答案 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
。我上周遇到了类似的问题。