为两个几乎相同的代码

时间:2015-08-22 17:07:59

标签: c printf

在以下两个代码中我无法理解问题。 第一个代码是:

#include <stdio.h>
main() {

    int num1, num2;

    scanf("%d%d", &num1, &num2);

    printf("I LOVE MY INDIA\n"); //here is '\n' after the statement
    printf("%d", num1/num2);

    return 0;
}

如果输入是num1=2num2=0,那么在gcc编译器中输出为:

  

我爱我的印度
     浮点异常(核心转储)

但是对于第二个代码:

#include <stdio.h>
main() {

    int num1, num2;

    scanf("%d%d", &num1, &num2);

    printf("I LOVE MY INDIA"); //here is no '\n'
    printf("%d", num1/num2);

    return 0;
}

对于与之前相同的输入显示:

  

浮点异常(核心转储)

在这两个代码之间只有一个区别。在第一个中,\n之后有I LOVE MY INDIA,而第二个代码中没有\n。 请解释为什么I LOVE MY INDIA没有显示在第二个代码中。

1 个答案:

答案 0 :(得分:6)

默认情况下,标准输出(stdout)是行缓冲的。

在第一种情况下,\n中的换行符printf()会导致输出缓冲区在发生崩溃之前刷新到输出。所以,你必须看到印刷声明。

OTOH,在第二种情况下,缺少\n会导致缓冲区保存数据,而下一个语句会导致异常并导致程序异常终止。因此,缓冲的数据没有机会被刷新到输出终端。因此,您没有 visual 输出。

也就是说,除以零导致undefined behavior严格来说,不能依靠你的程序来产生任何预期的输出。