在以下两个代码中我无法理解问题。 第一个代码是:
#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=2
和num2=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
没有显示在第二个代码中。
答案 0 :(得分:6)
默认情况下,标准输出(stdout
)是行缓冲的。
在第一种情况下,\n
中的换行符printf()
会导致输出缓冲区在发生崩溃之前刷新到输出。所以,你必须看到印刷声明。
OTOH,在第二种情况下,缺少\n
会导致缓冲区保存数据,而下一个语句会导致异常并导致程序异常终止。因此,缓冲的数据没有机会被刷新到输出终端。因此,您没有 visual 输出。
也就是说,除以零导致undefined behavior严格来说,不能依靠你的程序来产生任何预期的输出。