C语言的数字时钟-如何更新秒数?

时间:2019-07-04 05:59:44

标签: c

我正在用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]

2 个答案:

答案 0 :(得分:1)

这种肮脏的“烧掉”循环很久以前很常见,并且在某种程度上仍存在于嵌入式系统中。它们不专业,因为它们非常不准确,并且与特定系统上的特定编译器紧密耦合。可以肯定的是,您无法从PC上获得准确的计时。

首先,程序员总是倾向于将它们写错。在1980年代,您可以编写这样的循环,因为编译器很烂,但是如今,任何半个体面的编译器都会从可执行文件中删除整个循环。这是因为它不包含任何副作用。因此,为了使代码完全正常工作,必须将i声明为volatile以防止该优化。

一旦修复了严重的错误,就必须弄清楚循环实际需要多长时间。它是运行它所需的所有CPU指令的总和:进行比较,进行一些计算,然后将迭代器加1。如果对程序进行反汇编,则可以通过将所有指令所需的周期数加在一起来计算此值,然后乘以执行一个周期所需的时间,通常为1 / CPU频率(忽略流水线,潜在的RAM访问时间损失,多核等)。

最后,您将得出一个结论,即编写此代码的人只是从他们的帽子中摘了一个数字,然后最好在启用所有优化的情况下对循环执行时间进行基准测试。但更有可能的是,我会说这段代码是由一个不知道自己在做什么的人编写的,我们已经可以从丢失的volatile看出来。

答案 1 :(得分:0)

  1. 您不应使用goto。要进行无限循环,可以使用如图所示的while(1)循环。
  2. 您应该使用系统提供的睡眠或延迟功能。而不是编写自己的for循环。这是因为如果您使用其他计算机,迭代次数将不会改变。
  3. 下面给出的程序是一个粗略的时钟,并且会累积延迟,因为执行代码需要一些时间,而这在设计过程中没有考虑。
  4. 下面给出的代码假设使用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;
    }