我正在用C语言编程制作数字时钟。 它从用户那里获取当前时间的输入,然后更新第二个以时间格式HH:MM:SS显示时间。
我对第二秒内的for循环部分感到困惑。
for(i=0;i<8999990;i++)
i=i+1-1.
。
我已经尝试过运行代码。
假设我将输入10:30:20分别设为hh:min:sec。
现在,for循环将开始。
for hr循环,然后for min循环,然后for sec循环...然后for循环i ...
当sec为20时,for的for循环将运行89999990次,并执行i = i + 1-1,即更新i值。...
那么秒将是21 ....
我感到惊讶的是“ i”循环如何对sec值产生影响?
速度有多快?
[代码]
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
int h=0,m=0,s=00;
double i;
printf("Enter time in format of HH MM SS\n");
scanf("%d%d%d",&h,&m,&s);
start:;
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);
for( i=0;i<89999900;i++){
i=i+1-1;
}
}
s=0;
}
m=0;
}
goto start;
}
[/ code]
答案 0 :(得分:1)
这种肮脏的“烧掉”循环很久以前很常见,并且在某种程度上仍存在于嵌入式系统中。它们不专业,因为它们非常不准确,并且与特定系统上的特定编译器紧密耦合。可以肯定的是,您无法从PC上获得准确的计时。
首先,程序员总是倾向于将它们写错。在1980年代,您可以编写这样的循环,因为编译器很烂,但是如今,任何半个体面的编译器都会从可执行文件中删除整个循环。这是因为它不包含任何副作用。因此,为了使代码完全正常工作,必须将i
声明为volatile
以防止该优化。
一旦修复了严重的错误,就必须弄清楚循环实际需要多长时间。它是运行它所需的所有CPU指令的总和:进行比较,进行一些计算,然后将迭代器加1。如果对程序进行反汇编,则可以通过将所有指令所需的周期数加在一起来计算此值,然后乘以执行一个周期所需的时间,通常为1 / CPU频率(忽略流水线,潜在的RAM访问时间损失,多核等)。
最后,您将得出一个结论,即编写此代码的人只是从他们的帽子中摘了一个数字,然后最好在启用所有优化的情况下对循环执行时间进行基准测试。但更有可能的是,我会说这段代码是由一个不知道自己在做什么的人编写的,我们已经可以从丢失的volatile
看出来。
答案 1 :(得分:0)
下面给出的代码假设使用Linux sleep
函数,对于Windows sleep函数,您可以参考Sleep function in Windows, using C。如果您使用的是嵌入式系统,则将提供延迟功能,或者您可以使用其中一个计时器来编写自己的计时器。
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;
}