为什么我不能从两个被分割的元素中返回一个double元素
编码相对较新,对于基本的划分有一个问题。 如何来跟随不会返回我认为会的答案:
int a=7; int b=3; double c=0; c=a/b;
结果是2.3333,但是它只返回2.如果A和B被重新分配为双打,那么答案会变成2.333。 但是肯定是因为C已经是一个双倍的工作了?
如何int / int = double不起作用? 也许是一个奇怪的问题,但它让我感到困惑。
这是因为你正在使用operator/
的整数除法版本,它使用2个int
s并返回一个int
。 为了使用返回一个double
的double
版本,至less有一个int
必须被明确地转换成double
。
c = a/(double)b;
除了很less的例外(我只能想到其中的一个例外),C ++从expression式本身中确定expression式(或子expression式)的全部含义。 你对expression的结果做什么并不重要。 在你的情况下,在expression式a / b
,看不到double
的; 一切都是完整的。 所以编译器使用整数除法。 只有一次,它才会考虑如何处理,并将其转化为double
。
这里是:
a)划分两个int
s总是执行整数除法。 所以在你的情况下a/b
的结果只能是int
。
如果你想把a
和b
保留为int
,那么你至less要把它们中的一个加倍: (double)a/b
或者a/(double)b
或者(double)a/(double)b
。
b) c
是一个double
,所以它可以在assignement上接受一个int
值: int
自动转换为double
并赋值给c
。
c)记住,在分配时, 首先计算右边的expression式(根据上面的规则(a),而不考虑=
)左边的variables, 然后分配给=
(根据以上(b))。 我相信这完成了图片。
当你分两个整数时,结果将是一个整数,而不pipe你把它存储在一个double中。
c
是一个double
variables,但是赋值给它的值是一个int
值,因为它是由两个int
分割得到的,这就给了你“整数除法”(除去余数)。 那么在行c=a/b
发生了什么
- 评估
a/b
,创buildint
types的临时值 - 在转换为
double
types之后,将临时值赋给c
。
a/b
的值是a/b
不考虑上下文的情况下确定的(赋值为double
)。
在C ++语言中,subexpresison的结果永远不会受到周围环境的影响(除了一些罕见的例外)。 这是语言仔细遵循的原则之一。 expression式c = a / b
包含独立的子expression式a / b
,其独立于该子expression之外的任何解释。 该语言不关心你以后将分配结果到一个double
。 a / b
是整数除法。 别的什么都不重要。 您将在语言规范的许多angular落看到这个原则。 这是C ++(和C)的工作原理。
上面提到的exception的一个例子是在函数重载情况下的函数指针分配/初始化
void foo(int); void foo(double); void (*p)(double) = &foo; // automatically selects `foo(fouble)`
这是一个赋值/初始化左侧影响右侧行为的上下文。 (另外,引用到数组的初始化可以防止数组types的衰减,这是类似行为的另一个例子。)在所有其他情况下,右侧完全忽略了左侧。
/
运算符可用于整数除法或浮点除法。 你给它两个整数操作数,所以它是做整数除法,然后结果被存储在一个双。
这在技术上是依赖于语言的,但几乎所有的语言对待这个主题都是一样的。 当expression式中两种数据types之间存在types不匹配时,大多数语言将尝试在=
一侧转换数据,以根据一组预定义的规则匹配另一端的数据。
当将相同types的两个数字(整数,双精度等)分开时,结果将始终是相同的types(因此“int / int”总是会导致int)。
在这种情况下,您有double var = integer result
, 在计算后将整数结果转换为double ,在这种情况下分数数据已经丢失。 (大多数语言都会这样做,以防止types不准确而不会引发exception或错误)。
如果你想保持双倍的结果,你会想创build一个double var = double result
最简单的方法是强制等式右边的expression式加倍:
c = a/(double)b
在整数和double之间的区分会导致将整数转换为double(请注意,在进行math运算时,编译器通常会“向上”转换为最具体的数据types,以防数据丢失)。
之后, a
会结束双重,现在你有两个双打之间的分工。 这将创build所需的划分和分配。
再次请注意,这是语言特定的(甚至可以是编译器特定的),但是几乎所有的语言(当然,我可以想到的是我的头顶上的所有语言)都以相同的方式处理这个例子。