Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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++ 一个double是否会使等式中的每个int都加倍?_C++_Floating Point_Type Conversion_Integer Promotion - Fatal编程技术网

C++ 一个double是否会使等式中的每个int都加倍?

C++ 一个double是否会使等式中的每个int都加倍?,c++,floating-point,type-conversion,integer-promotion,C++,Floating Point,Type Conversion,Integer Promotion,存在一种浮点数据类型(例如,double)是否确保所有+、-、*、/、%等数学运算都采用双操作数 如果故事比这更复杂,是否有资源描述这些规则?当等式的结果为double时,我是否应该不问这样的问题并始终明确地将int转换为double。这里是我正在考虑的一些方程式。我故意没有在我的系统上编译和运行,因为这是一种依赖于编译器的类型 int a(1), b(2), c(3); double d(4.); double result1 = a + b/d + c; // equal to 4 or t

存在一种浮点数据类型(例如,
double
)是否确保所有+、-、*、/、%等数学运算都采用双操作数

如果故事比这更复杂,是否有资源描述这些规则?当等式的结果为
double
时,我是否应该不问这样的问题并始终明确地将
int
转换为
double
。这里是我正在考虑的一些方程式。我故意没有在我的系统上编译和运行,因为这是一种依赖于编译器的类型

int a(1), b(2), c(3);
double d(4.);
double result1 = a + b/d + c; // equal to 4 or to 4.5?
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?    
double result3 = a/b + d; // equal to 4 or to 4.5?
一个
double
是否将等式中的每个
int
提升为
double

否。仅为单个操作的结果(关于优先级)

4.5

3.75


4.

通常,如果二元运算符的一个操作数是浮点,另一个是整数,则该整数将转换为浮点,结果是浮点

在具有多个子表达式的复合表达式中,使用您可能知道的优先级规则分别处理每个运算符。因此,在
a*b+c*d
中,评估
a*b
,评估
c*d
,并将结果相加。
c*d
中的任何内容对
a*b
没有影响,反之亦然

当然,C++很复杂,用户定义的操作符可能有其他行为

定义规则的权威资源是C++标准。标准相当大,技术性很强。您可能更喜欢先检查C标准。有关标准的链接,请参见。任何关于C或C++的好书都应该描述默认类型转换和表达式求值。 我故意没有在我的系统上编译和运行,因为这是一种依赖于编译器的类型

int a(1), b(2), c(3);
double d(4.);
double result1 = a + b/d + c; // equal to 4 or to 4.5?
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?    
double result3 = a/b + d; // equal to 4 or to 4.5?
这与编译器无关。C++清楚地定义了它们的转换方式。 转换的方式取决于操作顺序

double result1 = a + b / d + c; // equal to 4 or to 4.5?
在本例中,首先进行除法。因为这是一个整数除以一个double,所以编译器通过将整数转换成double来处理这个问题。因此,
b/d
的结果是双精度的

<> > C++下一步就是将代码< < /代码>添加到<代码> B/D 的结果。这是一个添加到double的int,因此它将int转换为double并进行加法,从而生成double。同样的事情也发生在
c

double result3 = a / b + d; // equal to 4 or to 4.5?
在本例中,首先处理除法
a
b
都是整数,因此不进行转换。
a/b
的结果为int类型,为0

然后,将结果添加到
d
。这是int加双,所以C++将int转换为双,结果是双.< /p> 即使在这个表达式中存在一个double,
a/b
将首先求值,double在执行到达double之前没有任何意义。因此,出现整数除法

我发现晋升和转换规则相当复杂。通常,类似整数的数字(short、int、long)被提升为浮点等价值(float、double)。但大小差异和符号使事情变得复杂


关于转换的细节。

你必须考虑每个操作符的优先级,你必须像解析器一样思考:

double result1 = a + b/d + c; // equal to 4 or to 4.5?

这是一个+(b/d)+c,因为'/'运算符具有最大的优先权。然后,这2个操作首先是什么,这并不重要,因为浮点操作数位于中间,并且它“感染”其他操作数,使它们为两倍。所以它是4.5。p>

double result2 = (a + b)/d + c; // equal to 3 or to 3.75?  
这里也一样,就像((a+b)/d)+c,所以a+b是3,3变成一个浮点数,因为它被提升为double,因为是d的股息,是double,所以它是0.75+3,也就是3.75

double result3 = a/b + d; // equal to 4 or to 4.5?
就像(a/b)+d,所以a/b是零,d是4,所以是4。
解析器按照优先顺序执行所有操作,因此您可以准确地知道表达式的结果。

考虑操作顺序。如果需要,每个操作都会升级。明白了,所以每个操作都有两个操作数(大多数情况下),如果一个是
float
,另一个是
int
,则
int
会升级为float。@LexFridman是的,类似于这样。那么
a/b*d
呢?
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?  
double result3 = a/b + d; // equal to 4 or to 4.5?