为两个几乎相同的代码显示不同的输出

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

#include  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编译器中输出为:

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

但对于第二个代码:

 #include  main() { int num1, num2; scanf("%d%d", &num1, &num2); printf("I LOVE MY INDIA"); //here is no '\n' printf("%d", num1/num2); return 0; } 

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

浮点exception(核心转储)

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

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

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

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

也就是说,除以零会导致未定义的行为 ,严格来说,您的程序不能依赖于产生任何预期的输出。