Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C整数和浮点除法输出_C_Integer_Division - Fatal编程技术网

C整数和浮点除法输出

C整数和浮点除法输出,c,integer,division,C,Integer,Division,有人能解释一下以下代码的输出吗 为什么最后一行总是0.17 float a = 17, b = 100; printf("%f\n", 17/100); printf("%f\n", a/b); printf("%f\n", 17/b); printf("%f\n", 17.0f/b); printf("%f\n", a/100); printf("%f\n", a/100.0f); printf("%f\n", 5/100); 输出 0.000000 0.170000 0.170000

有人能解释一下以下代码的输出吗

为什么最后一行总是0.17

float a = 17, b = 100;

printf("%f\n", 17/100);
printf("%f\n", a/b);
printf("%f\n", 17/b);
printf("%f\n", 17.0f/b);
printf("%f\n", a/100);
printf("%f\n", a/100.0f);
printf("%f\n", 5/100);
输出

0.000000
0.170000
0.170000
0.170000
0.170000
0.170000
0.170000

这叫做
未定义的行为
,不要试图理解为什么会发生这种情况,因为顾名思义,它是
未定义的
!。出现未定义行为是因为您试图打印一个double,但传递了两个整数。请注意,您还会收到一条警告:

14:25:警告:格式“%f”要求参数类型为“double”,但参数2的类型为“int”[-Wformat=]

将最后一行更改为:

    printf("%f\n", 5.0/100);

这被称为
未定义的行为
,不要试图理解为什么会发生这种情况,因为顾名思义,它是
未定义的
!。出现未定义行为是因为您试图打印一个double,但传递了两个整数。请注意,您还会收到一条警告:

14:25:警告:格式“%f”要求参数类型为“double”,但参数2的类型为“int”[-Wformat=]

将最后一行更改为:

    printf("%f\n", 5.0/100);

它将按预期工作。

因为您正在除以整数,然后尝试打印(整数结果为)浮点值

试试这个

// Example program
#include <stdio.h>

int main()
{
    float a = 17, b = 100;

    printf("%f\n", 17.0/100);
    printf("%f\n", a/b);
    printf("%f\n", 17/b);
    printf("%f\n", 17.0f/b);
    printf("%f\n", a/100);
    printf("%f\n", a/100.0f);
    printf("%f\n", 5.00/100);

    return 0;
}
//示例程序
#包括
int main()
{
浮点数a=17,b=100;
printf(“%f\n”,17.0/100);
printf(“%f\n”,a/b);
printf(“%f\n”,17/b);
printf(“%f\n”,17.0f/b);
printf(“%f\n”,a/100);
printf(“%f\n”,a/100.0f);
printf(“%f\n”,5.00/100);
返回0;
}

因为您正在除以整数,而不是试图打印(整数结果)浮点值

试试这个

// Example program
#include <stdio.h>

int main()
{
    float a = 17, b = 100;

    printf("%f\n", 17.0/100);
    printf("%f\n", a/b);
    printf("%f\n", 17/b);
    printf("%f\n", 17.0f/b);
    printf("%f\n", a/100);
    printf("%f\n", a/100.0f);
    printf("%f\n", 5.00/100);

    return 0;
}
//示例程序
#包括
int main()
{
浮点数a=17,b=100;
printf(“%f\n”,17.0/100);
printf(“%f\n”,a/b);
printf(“%f\n”,17/b);
printf(“%f\n”,17.0f/b);
printf(“%f\n”,a/100);
printf(“%f\n”,a/100.0f);
printf(“%f\n”,5.00/100);
返回0;
}

UB此处
。。。“%f\n”,17/100)一切就绪所有其余的都是(坏)运气,可能重复UB这里
。。。“%f\n”,17/100)
allready其余的都是(坏)运气,可能是重复的,我希望最后一行的输出是0,有没有解释为什么它坚持0.17?您将使用的每个comipler可能有不同的行为,一个将打印0,另一个将打印0.17,另一个将打印2。为什么?因为它是未定义的。如果你想了解更多-谷歌:
C未定义的行为
,有很多关于这个主题的文章。好的,谢谢你到目前为止。。。我只是想知道为什么第一个和最后一个printfIt之间的行为如此不同,告诉某人“不要试图理解”是有害的。虽然C标准中没有定义的行为可能会令人困惑,并且不是编写工作C程序所严格需要的,但理解它还是有好处的。它提供了对编译器、处理器和其他系统组件如何工作的深入了解,这种深入了解既有助于诊断bug,也有助于了解纯C以外的知识。在本例中,通过打印
a/b
17.0f/b
来传递浮点参数的寄存器中的浮点值保留在寄存器中,以便后续调用
printf
,因此可以重用。我希望最后一行的输出为0,有没有解释为什么它坚持使用0.17?您将使用的每个comipler可能有不同的行为,一个将打印0,另一个将打印0.17,另一个将打印2。为什么?因为它是未定义的。如果你想了解更多-谷歌:
C未定义的行为
,有很多关于这个主题的文章。好的,谢谢你到目前为止。。。我只是想知道为什么第一个和最后一个printfIt之间的行为如此不同,告诉某人“不要试图理解”是有害的。虽然C标准中没有定义的行为可能会令人困惑,并且不是编写工作C程序所严格需要的,但理解它还是有好处的。它提供了对编译器、处理器和其他系统组件如何工作的深入了解,这种深入了解既有助于诊断bug,也有助于了解纯C以外的知识。在本例中,保留在寄存器中用于通过打印
a/b
17.0f/b
传递浮点参数的浮点值保留在寄存器中,以便后续调用
printf
,因此可以重复使用。