数字时钟在C-如何更新秒?

数字时钟在C-如何更新秒?,c,C,我在用C语言编程制作一个数字时钟。 它从用户那里获取当前时间的输入,然后更新第二个以HH:MM:SS格式显示时间 我对for循环中位于second内的部分感到困惑 for(i=0;i<8999990;i++) i=i+1-1. for(i=0;i这种肮脏的“烧掉”循环很久以前就很常见了,并且在某种程度上仍然存在于嵌入式系统中。它们并不专业,因为它们非常不准确,并且与特定系统上构建的特定编译器紧密耦合。这是肯定的,对于PC来说,你无法从中获得准确的计时 首先,程序员总是倾向于编写错误的循环

我在用C语言编程制作一个数字时钟。 它从用户那里获取当前时间的输入,然后更新第二个以HH:MM:SS格式显示时间

我对for循环中位于second内的部分感到困惑

for(i=0;i<8999990;i++)
i=i+1-1.
for(i=0;i这种肮脏的“烧掉”循环很久以前就很常见了,并且在某种程度上仍然存在于嵌入式系统中。它们并不专业,因为它们非常不准确,并且与特定系统上构建的特定编译器紧密耦合。这是肯定的,对于PC来说,你无法从中获得准确的计时

首先,程序员总是倾向于编写错误的循环。在20世纪80年代,你可以编写这样的循环,因为编译器是垃圾,但现在任何半体面的编译器都会从可执行文件中删除整个循环。这是因为它不包含任何副作用。因此,为了使代码能够正常工作,你必须声明
i
as
volatile
以防止优化

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

最后你会得出结论,不管是谁写了这段代码,只是从他们的帽子里拿出了一个数字,然后在启用所有优化的情况下,充其量测试了循环执行时间。但更可能的是,我会说这段代码是由不知道他们在做什么的人编写的,我们已经可以从丢失的代码中看出这一点>易失性

  • 您不应该使用goto。要拥有无限循环,可以使用while(1)循环,如图所示

  • 您应该使用系统提供的休眠或延迟功能,而不是编写自己的for循环。这是因为如果您转到其他机器,迭代次数将发生变化
  • 下面给出的程序是一个粗略的时钟,会累积延迟,因为在设计过程中没有考虑到执行代码需要一些时间
  • 下面给出的代码假设linux
    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;h
    i=i+1-1
    is
    i=i+0
    is
    i=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;
    }