C- while循环未解释的行为

时间:2015-12-16 12:33:46

标签: c loops while-loop printf

我正在尝试运行以下代码:

ArrayList<String> data = (ArrayList<String>) getIntent().getParcelableExtra("dataList");

我期待它打印&#34; 3秒钟&#34;每3秒后,但它不会显示该消息。 我尝试使用gdb调试它,但似乎没有任何错误,仍然没有输出。 在尝试调试时,我添加了一个printf语句,并且可以看到输出。

如果我在删除// printf后运行程序(&#34;%d \ n&#34;,ms-oldms);声明,没有再输出。我不确定发生了什么以及它是否依赖任何东西。

$ gcc --version gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2

2 个答案:

答案 0 :(得分:10)

输出缓冲是原因。

当连接到终端设备时,

stdout默认为线路缓冲。您可以使用fflush(stdout);或使用\n中的printf()printf("3 seconds up\n");来清除此信息。 或使用setbuf(stdout, 0);

禁用它

I / O通常很慢。所以实现使用固定大小的缓冲区和printf一旦它满了。 实际上,过于频繁地调用fflush(stdout);会影响性能。

答案 1 :(得分:1)

发布的代码有几个问题

  1. 在检查经过时间之前,变量oldms未设置为任何特定值
  2. 在格式字符串中没有调用fflush(stdout);或尾随换行符('\ n'),将不会输出任何内容(很长一段时间,直到系统stdout缓冲区被填充)
  3. 为了便于阅读,公理only one statement per line and (at most) one variable declaration per statement应用于代码
  4. 以下代码干净地编译并执行所需的操作

    #include <sys/time.h>
    #include <stdio.h>
    
    int main()
    {
        unsigned int ms;
        unsigned int oldms = 0;
        unsigned int dif;
        struct timeval tv;
    
        gettimeofday(&tv, NULL);
        oldms = tv.tv_sec;
    
        while(1)
        {
            gettimeofday(&tv, NULL);
            ms=tv.tv_sec;
            //printf("%d\n",ms-oldms );
            dif=ms-oldms;
    
            if(dif>3)
            {
                printf("3 seconds up\n");
                oldms=ms;
            }
        }
    } // end function: main