为两个几乎相同的代码显示不同的输出
在以下两个代码中我无法理解问题。 第一个代码是:
#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=2
且num2=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(核心转储)
在这两个代码之间只有一个区别。 在第一个中我有一个\n
在I LOVE MY INDIA
,在第二个代码中没有\n
。 请解释为什么I LOVE MY INDIA
没有显示在第二个代码中。
默认情况下,标准输出( stdout
)是行缓冲的。
在第一种情况下, printf()
的换行符\n
会导致输出缓冲区在崩溃发生之前刷新到输出。 所以,你必须看到print语句。
OTOH,在第二种情况下,缺少\n
导致缓冲区保存数据,下一个语句导致exception和程序exception终止。 因此,缓冲的数据没有机会被刷新到输出终端。 因此,你没有视觉输出。
也就是说,除以零会导致未定义的行为 ,严格来说,您的程序不能依赖于产生任何预期的输出。