我目前正在阅读“ 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?因为我被声明为浮动对象,所以它保持浮动吗?
答案 0 :(得分:2)
是的,如果您将变量声明为浮点型,则代码中不会更改它。如果您在int和float之间进行运算并放入float变量,则会得到float结果,反之亦然,如果将变量放入int var中,则会丢失数字的小数部分
您无法在C中更改变量类型。
答案 1 :(得分:0)
如果书上说的话,那是错误的。就这么简单!
将整数添加到浮点数时,会得到一个浮点数。此外,您已将结果分配给浮点数,因此不能有其他任何结果。对象不会更改类型。
答案 2 :(得分:0)
由于您将fahr
声明为float
,因此您为其分配的任何值都将转换为float
。
int
和float
之间的任何算术运算都将产生float
结果。这被指定为常规算术转换的一部分:
6.3.1.8常规算术转换
1许多期望算术类型的操作数的运算符会导致转换并产生结果 以类似的方式输入。目的是确定操作数的通用实型 结果。对于指定的操作数,将转换每个操作数,而无需更改类型 域,将其类型转换为对应的实型是普通实型。除非 除非另有明确说明,否则普通实型也是对应的实型 结果,如果操作数相同,则其类型域是操作数的类型域, 否则复杂。这种模式称为常规算术转换:
首先,如果两个操作数的对应实型为long double
,则另一个 操作数将在不更改类型域的情况下转换为相应的实型为long double
的类型。
否则,如果其中一个操作数的对应实型为double
,则另一个 操作数在不更改类型域的情况下被转换为其类型 对应的实型为double
。
否则,如果其中一个操作数的对应实型为float
,则另一个 操作数在不更改类型域的情况下被转换为其类型 对应的实型为float
。 62)
否则,将对两个操作数执行整数提升。然后 以下规则适用于提升后的操作数:
如果两个操作数具有相同的类型,则无需进一步转换。
否则,如果两个操作数都具有符号整数类型或都具有无符号 整数类型,具有较小整数转换等级的类型的操作数为 转换为排名更高的操作数的类型。
否则,如果具有无符号整数类型的操作数的秩更大或 等于另一个操作数类型的等级,然后是 有符号整数类型将转换为无符号操作数的类型 整数类型。
否则,如果带符号整数类型的操作数的类型可以表示 具有无符号整数类型的操作数类型的所有值,然后 无符号整数类型的操作数将转换为 带符号整数类型的操作数。
否则,两个操作数都将转换为无符号整数类型 对应于带符号整数类型的操作数的类型。
62)例如,将double _Complex
和float
相加仅需要转换float
操作数到double
(并产生double _Complex
结果)。
两个int
之间的算术运算将产生int
的结果。例如,1/2
产生0
,4/3
产生1
,7/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选择了最高分辨率的算术运算符,因此您的情况下浮法获胜。