将旧变量值与while语句中的新值进行比较?

时间:2012-03-21 16:38:27

标签: c

为什么这段代码不会多次打印“新时间”? 是否可以修复,而不在循环外调用clock()?

#include <stdio.h>
#include <time.h>
int main(char argv[], int argc)
{
    double lastTime = 0;
    while(1)
    {
        printf("New time:\n");
        while(lastTime == (lastTime = (double)clock() / (double)CLOCKS_PER_SEC))
        {
            printf("%f\n", lastTime);
        }
    }
    return 0;
}

2 个答案:

答案 0 :(得分:4)

您的代码似乎已被切断。但你的问题是这个逻辑:

while (lastTime == (lastTime = something))

测试永远是真实的;你为lastTime指定了一些值,然后将它与自身进行比较。

答案 1 :(得分:0)

此行无法正常工作(我已添加了右括号,因为上面缺少这些内容):

while(lastTime == (lastTime = (double)clock() / (double)CLOCKS_PER_S))

由于括号,首先评估比较的右侧(赋值),基本上导致这样:

while(lastTime == lastTime)

这基本上导致while(0 == 0),显然是while(true)

您至少需要第二个变量来保存之前的值。然后只需为lastTime == 0添加一个额外的案例(即第一次运行循环)。


另外,正如上面评论中所提到的,你不应该比较这个值,因为两个双值并不容易完全相同(特别是在计算时)。

如果你想每隔x毫秒(或任何其他时间)做一些动作,你应该使用一个计数器来累计时间:

for(clock_t timeSkipped = 0, lastTick = clock() ; ; timeSkipped += clock() - lastTick, lastTick = clock()) {
    while(timeSkipped > 0.5 * CLOCKS_PER_S) { // example: this will run the content of this loop at a fixed time step of once every half second
        timeSkipped -= 0.5 * CLOCKS_PER_S;
        printf("Tick!");
    }

}