C- while 循环无法解释的行为

标签 c loops while-loop printf

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

#include <sys/time.h>
#include <stdio.h>

int main()
{
unsigned int ms, oldms = 0,dif;
struct timeval tv;
while(1)
{
 gettimeofday(&tv, NULL);
 ms=tv.tv_sec; 
 //printf("%d\n",ms-oldms );
 dif=ms-oldms;
 if(dif>3)
   {    
        printf("3 seconds up");
        oldms=ms;
   }
 }
}

我希望它每 3 秒打印一次“3 seconds up”,但它没有显示该消息。 我尝试使用 gdb 对其进行调试,但似乎没有任何问题,而且仍然没有输出。 在尝试调试时,我添加了一个 printf 语句,神奇地可以看到输出。

如果我在删除//printf("%d\n",ms-oldms ) 后运行程序; statement ,又没有输出。我不确定发生了什么,也不确定它是否依赖于任何东西。

$gcc --版本 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

最佳答案

输出缓冲是原因。

stdout 在连接到终端设备时默认是行缓冲的。您可以使用 fflush(stdout); 或在 printf() 中使用 \n 来清除它,即 printf("3 seconds up\n");。 或使用 setbuf(stdout, 0);

禁用它

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

关于C- while 循环无法解释的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34312190/

相关文章:

PHP 扩展 : why int var changes to 0?

c - 如何使用 gets_s 在 C 中使用 atoi 转换 - 包含示例代码

c - Linux命令打印出C函数代码

R - 如何将这个嵌套的 for 循环转换为可以改变列表的 lapply 函数

python - 在 Python 中使用 Selenium 检查新内容

python - 在线排序并删除两个整数流上的重复项

PHP 包装每 4 个元素

由于循环,Swift 完成处理程序 For 循环将执行一次而不是 10 次

javascript - 不确定为什么没有达到我的限制

php - 在 while 中从 mysql_fetch_assoc 获取重复值