数字时钟在C-如何更新秒?
我在用C语言编程制作一个数字时钟。 它从用户那里获取当前时间的输入,然后更新第二个以HH:MM:SS格式显示时间 我对for循环中位于second内的部分感到困惑数字时钟在C-如何更新秒?,c,C,我在用C语言编程制作一个数字时钟。 它从用户那里获取当前时间的输入,然后更新第二个以HH:MM:SS格式显示时间 我对for循环中位于second内的部分感到困惑 for(i=0;i<8999990;i++) i=i+1-1. for(i=0;i这种肮脏的“烧掉”循环很久以前就很常见了,并且在某种程度上仍然存在于嵌入式系统中。它们并不专业,因为它们非常不准确,并且与特定系统上构建的特定编译器紧密耦合。这是肯定的,对于PC来说,你无法从中获得准确的计时 首先,程序员总是倾向于编写错误的循环
for(i=0;i<8999990;i++)
i=i+1-1.
for(i=0;i这种肮脏的“烧掉”循环很久以前就很常见了,并且在某种程度上仍然存在于嵌入式系统中。它们并不专业,因为它们非常不准确,并且与特定系统上构建的特定编译器紧密耦合。这是肯定的,对于PC来说,你无法从中获得准确的计时
首先,程序员总是倾向于编写错误的循环。在20世纪80年代,你可以编写这样的循环,因为编译器是垃圾,但现在任何半体面的编译器都会从可执行文件中删除整个循环。这是因为它不包含任何副作用。因此,为了使代码能够正常工作,你必须声明i
asvolatile
以防止优化
一旦这个严重的错误被修复,你必须计算出循环实际需要多长时间。它是运行它所需的所有CPU指令的总和:一个比较,一些计算,然后将迭代器增加1。如果你反汇编程序,你可以通过将所有指令所需的周期数相加来计算,然后执行一个周期所需的时间,通常为1/CPU频率(忽略流水线、潜在RAM访问时间损失、多核等)
最后你会得出结论,不管是谁写了这段代码,只是从他们的帽子里拿出了一个数字,然后在启用所有优化的情况下,充其量测试了循环执行时间。但更可能的是,我会说这段代码是由不知道他们在做什么的人编写的,我们已经可以从丢失的代码中看出这一点>易失性
sleep
函数,对于windows睡眠函数,您可以参考。如果您使用的是嵌入式系统,则会有可用的延迟函数,或者您可以使用其中一个计时器编写自己的函数
while(1)
{
for(h;h<24;h++)
{
for(m;m<60;m++)
{
for(s;s<60;s++)
{
system("cls");
printf("\n\n\n\n\n\n\t\t\t\t\t\t%d:%d:%d\n",h,m,s);
sleep(1000);
}
s=0;
}
m=0;
}
h = 0;
}
while(1)
{
对于(h;hi=i+1-1
isi=i+0
isi=i
…什么都不做。外部循环改变i
,虽然我猜只是一个糟糕的延迟循环,持续1s。你应该使用系统提供的延迟函数。你正在使用的是哪个操作系统和编译器?从技术上讲,因为该循环没有可观察到的行为,编译器m无论如何都可以完全移除它。你想让i
变得volatile
,让它以这种方式可靠地执行无意义的工作。这是不正确的。时钟会漂移。需要计算睡眠时间以确保时钟保持准确。我在第3点中提到过这一点。因此它不是一个时钟,它是一个粗糙的时钟。为了它更准确,需要更多的努力。人们还需要检查这个时钟实际上有多不准确。
while(1)
{
for(h;h<24;h++)
{
for(m;m<60;m++)
{
for(s;s<60;s++)
{
system("cls");
printf("\n\n\n\n\n\n\t\t\t\t\t\t%d:%d:%d\n",h,m,s);
sleep(1000);
}
s=0;
}
m=0;
}
h = 0;
}