我是一名大学生,我正在尝试通过以下代码验证不同的printf输出:
#include <stdio.h>
int main()
{
int i=3,j=0;
float x=5,y;
printf("1: %d\n", i);
printf("2: %d\n", i/j);
printf("3: %d\n", i*i);
printf("4: i = \n");
i=i + j;
printf("6: %f\n", x/y);
printf("7: x = %f\n");
printf("8: %d\n", i/2);
printf("9: %f", x/2) ;
return 0;
}
在执行阶段,在第一个输出printf("1: %d\n", i);
之后,终端没有任何显示。
任何想法? (没有编译错误)
答案 0 :(得分:1)
i / j
为3 / 0
,C中的整数除以0为未定义行为,这意味着可能发生任何事情。在您的情况下,“字面上的意思”是指“ go back in time并使先前的printf
不起作用,然后崩溃”(这实际上是由于缓冲的工作原理而发生的,但这只是实现细节)。>
答案 1 :(得分:1)
当printf("2: %d\n", i/j);
和i = 3
时,您期望j = 0
行得到什么?
您看到程序在那时中断的原因吗?
您希望从这些行中得到什么输出?
解释每行的原因!
printf("6: %f\n", x/y);
printf("7: x = %f\n");
printf("9: %f", x/2) ;
由于您提供了答案,因此您对前两个期望的看法是错误的。
printf("6: %f\n", x/y); <-- "y" as you said is not declared, so I suppose to have a random float number.
y
已被声明为 ,但尚未初始化。
除以未初始化的值,实际上会产生未知的值。
但是根据规范,这是未定义的行为,一切都会发生。
printf("7: x = %f\n"); <-- this is one other question, because the terminal gives me a random value either.
因为您没有提供进入%f
插槽的参数,这是未定义的行为,并且您可能会得到鼻恶魔。