为什么将浮点数和整数相加会导致浮点数?

时间:2019-02-14 21:18:23

标签: c clang

我目前正在阅读“ The C Programming Language-2nd Edition”。在第一章中,解释了对具有int的float进行运算会得出int的情况。有这个程序:

#include <stdio.h>

int main()
{
    float fahr, celsius;
    int lower, upper, step;

    lower = 0;
    upper = 300;
    step = 20;

    fahr = lower;
    while (fahr <= upper)
    {
        celsius = (5.0/9.0) * (fahr-32.0);
        printf("%3.0f\t%6.1f\n", fahr, celsius);
        fahr = fahr + step;
    }
}

执行fahr = fahr + step行时,fahr是否应该成为一个int?因为我被声明为浮动对象,所以它保持浮动吗?

4 个答案:

答案 0 :(得分:2)

是的,如果您将变量声明为浮点型,则代码中不会更改它。如果您在int和float之间进行运算并放入float变量,则会得到float结果,反之亦然,如果将变量放入int var中,则会丢失数字的小数部分

您无法在C中更改变量类型。

答案 1 :(得分:0)

如果书上说的话,那是错误的。就这么简单!

将整数添加到浮点数时,会得到一个浮点数。此外,您已将结果分配给浮点数,因此不能有其他任何结果。对象不会更改类型。

答案 2 :(得分:0)

由于您将fahr声明为float,因此您为其分配的任何值都将转换为float

intfloat之间的任何算术运算都将产生float结果。这被指定为常规算术转换的一部分:

6.3.1.8常规算术转换

1许多期望算术类型的操作数的运算符会导致转换并产生结果 以类似的方式输入。目的是确定操作数的通用实型 结果。对于指定的操作数,将转换每个操作数,而无需更改类型 域,将其类型转换为对应的实型是普通实型。除非 除非另有明确说明,否则普通实型也是对应的实型 结果,如果操作数相同,则其类型域是操作数的类型域, 否则复杂。这种模式称为常规算术转换

首先,如果两个操作数的对应实型为long double,则另一个 操作数将在不更改类型域的情况下转换为相应的实型为long double的类型。

否则,如果其中一个操作数的对应实型为double,则另一个 操作数在不更改类型域的情况下被转换为其类型 对应的实型为double

否则,如果其中一个操作数的对应实型为float,则另一个 操作数在不更改类型域的情况下被转换为其类型 对应的实型为float 62)

否则,将对两个操作数执行整数提升。然后 以下规则适用于提升后的操作数:

如果两个操作数具有相同的类型,则无需进一步转换。

否则,如果两个操作数都具有符号整数类型或都具有无符号 整数类型,具有较小整数转换等级的类型的操作数为 转换为排名更高的操作数的类型。

否则,如果具有无符号整数类型的操作数的秩更大或 等于另一个操作数类型的等级,然后是 有符号整数类型将转换为无符号操作数的类型 整数类型。

否则,如果带符号整数类型的操作数的类型可以表示 具有无符号整数类型的操作数类型的所有值,然后 无符号整数类型的操作数将转换为 带符号整数类型的操作数。

否则,两个操作数都将转换为无符号整数类型 对应于带符号整数类型的操作数的类型。
62)例如,将double _Complexfloat相加仅需要转换 float操作数到double(并产生double _Complex结果)。

C 2011 Online Draft

两个int之间的算术运算将产生int的结果。例如,1/2产生04/3产生17/3产生2,依此类推。如果分配整数除法的结果到float变量中,它将存储为float,但不会得到结果的小数部分。 IOW,给定的代码如

float fahr = 4 / 3;
printf( "%f\n", fahr );

您的输出将是1.0,而不是1.33333。如果要浮点结果,则至少一个操作数必须是浮点类型:

float fahr = 4 / 3.0f;
printf( "%f\n", fahr );

将输出1.33333

答案 3 :(得分:-2)

+1用于阅读该书。 C选择了最高分辨率的算术运算符,因此您的情况下浮法获胜。