【问题标题】:C - Printf doesn't output the expected resultC - Printf 没有输出预期的结果
【发布时间】:2020-04-17 15:54:43
【问题描述】:

我是一名大学生,我正在尝试通过以下代码验证不同的 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); 之后,我在终端中没有得到任何东西。 任何想法? (没有编译错误)

【问题讨论】:

  • 您正在尝试除以零。
  • @Gabriele Berselli 变量 y 未初始化。
  • 期望为每一行得到什么输出?
  • 操作3/0没有“预期结果”。

标签: c printf output


【解决方案1】:

i / j3 / 0,在 C 中整数除以 0 是未定义行为,这意味着实际上任何事情都可能发生。在您的情况下,“字面上的任何东西”意味着“go back in time 并使之前的 printf 不起作用,然后崩溃”(这实际上是由于缓冲的工作原理而发生的,但这只是一个实现细节)。

【讨论】:

  • 作为一个次要的 nit,它不是整数除以零,这是未定义的行为,而是 / 的正确操作数为 0(任何地方,出于任何目的),即 UB。
  • @kopecs float f = 1.5 / 0 不是定义为无穷大吗?
  • 来自 C99(至少是 2007 年工作副本)6.5.5.5:“/ 运算符的结果是第一个操作数除以第二个的商;@ 的结果987654329@ 运算符是余数。在这两种运算中,如果第二个操作数的值为零,则行为未定义。 (我承认,我有点惊讶它没有为浮点数定义,但我认为该标准不需要 IEEE 754 或同等标准)。
  • @kopecs 在“纯”C99 中你是对的,但附件 F 覆盖了这一点:The behaviour of floating point division by zero
  • 这似乎就是为什么该标准似乎与我的常识相冲突的原因。谢谢!
【解决方案2】:

i = 3j = 0 时,您期望从printf("2: %d\n", i/j); 得到什么?

您是否看到您的程序可能会在此时中断的原因?

后续问题:

您希望从这些行中得到什么输出?
解释每一行的原因!

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 槽的参数,所以这是未定义的行为,您可能会得到鼻恶魔。

【讨论】:

  • printf("6: %f\n", x/y);
猜你喜欢
  • 2017-05-17
  • 2020-05-29
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 1970-01-01
相关资源
最近更新 更多