C++ 交换数学运算的阶

C++ 交换数学运算的阶,c++,operators,language-lawyer,type-promotion,C++,Operators,Language Lawyer,Type Promotion,我陷入了一个奇怪的问题(在阅读一段粗糙的代码时自己问)。让我们看一下表达式: double a = c*d*e*2/3*f; 其中c、d、e、f是类型为double的初始化变量。标准是否保证将其视为c*d*e*2(双重结果),然后除以3,再乘以f(或类似行为)。显然,将2/3计算为0是不可取的 标准的哪一段定义了这一点?基于 [简介摘要]-注7(非规范性): 运算符可以根据通常的数学规则重新组合 仅当运算符真的是结合的或可交换的 MDA的数学规则是从左到右(考虑到运算符的关联性和优先级)。因

我陷入了一个奇怪的问题(在阅读一段粗糙的代码时自己问)。让我们看一下表达式:

double a =  c*d*e*2/3*f;
其中c、d、e、f是类型为
double
的初始化变量。标准是否保证将其视为
c*d*e*2
(双重结果),然后除以
3
,再乘以
f
(或类似行为)。显然,将2/3计算为0是不可取的

标准的哪一段定义了这一点?

基于

[简介摘要]-注7(非规范性):

运算符可以根据通常的数学规则重新组合 仅当运算符真的是结合的或可交换的

MDA的数学规则是从左到右(考虑到运算符的关联性和优先级)。因此,评估如下:

(((((c * d) * e) * 2) / 3) * f)
基于

[简介摘要]-注7(非规范性):

运算符可以根据通常的数学规则重新组合 仅当运算符真的是结合的或可交换的

MDA的数学规则是从左到右(考虑到运算符的关联性和优先级)。因此,评估如下:

(((((c * d) * e) * 2) / 3) * f)
总之,是的

您要查找的属性称为运算符关联性。它定义了当不存在括号时,相同优先级的运算符(如
*
/
)如何分组和排序

在您的情况下,
*
/
具有相同的优先级,并且都是左关联的-即,它们是从左到右计算的。这意味着
c
将乘以
d
,然后将结果乘以
e
,然后将结果乘以
2
(这将使用浮点运算完成,因为您将
双精度
乘以
int
文字),然后除以
3
(同样,使用浮点运算)最后乘以
f

有关更多信息,请参见。

一句话-是

您要查找的属性称为运算符关联性。它定义了当不存在括号时,相同优先级的运算符(如
*
/
)如何分组和排序

在您的情况下,
*
/
具有相同的优先级,并且都是左关联的-即,它们是从左到右计算的。这意味着
c
将乘以
d
,然后将结果乘以
e
,然后将结果乘以
2
(这将使用浮点运算完成,因为您将
双精度
乘以
int
文字),然后除以
3
(同样,使用浮点运算)最后乘以
f


有关更多信息,请参见。

两个
*
/
具有相同的优先级,并且是从左到右关联的,这意味着

a*b*c*d
被解析为

((a*b)*c)*d
如果将任何
*
替换为
/
,情况也是如此


来源:

两个
*
/
具有相同的优先级,并且是从左到右关联的,这意味着

a*b*c*d
被解析为

((a*b)*c)*d
如果将任何
*
替换为
/
,情况也是如此


来源:

您链接到的部分是关于函数对象的。那句话离这里不远,我就知道它应该在那里!你的链接指向了错误的段落,它在第4.1.1页。但是知道了措辞,我找到了。现在是第1.7节,它根本不存在。只需在答案中填入章节名称,即带有段落编号的
[chpater.subchapter.etc]
。这不会在修改中有太多的变化,而且会证明你的答案是正确的。它也比一个笼统的“标准”更具信息性。这是
[intro.abstract]/7
,但它是一个非规范性的注释(你应该提到它)。应该有更好的报价。@Swift那
new
是从哪里来的?我说的是可读性,不是动态分配。我在嵌入式系统上工作过,这并不是因为你有一些细节,你不能编写易于阅读的代码。你链接到的部分是关于函数对象的。那句话离这里不远,我就知道它应该在那里!你的链接指向了错误的段落,它在第4.1.1页。但是知道了措辞,我找到了。现在是第1.7节,它根本不存在。只需在答案中填入章节名称,即带有段落编号的
[chpater.subchapter.etc]
。这不会在修改中有太多的变化,而且会证明你的答案是正确的。它也比一个笼统的“标准”更具信息性。这是
[intro.abstract]/7
,但它是一个非规范性的注释(你应该提到它)。应该有更好的报价。@Swift那
new
是从哪里来的?我说的是可读性,不是动态分配。我研究过嵌入式系统,并不是因为你有一些细节,你无法编写易于阅读的代码。可能与、、等重复。@jww缩小了问题的范围,目的是标准中实际适用的条款。正如YSC之前所指出的,这里使用的数学术语非常松散,甚至不正确。交换性意味着重新排列操作数,而不是操作,例如
a*b
vs
b*a
。你的意思是关联性,例如
(a*b)*c
vs
a*(b*c)
。乘法在数学上既是相联的又是可交换的,但FP乘法不是相联的,因为中间结果的舍入可能不同。然而,除法既不是结合的,也不是交换的
a*b/c
是除法是数学的一种特殊情况。与乘法有关。可能与、、等重复@jww缩小了问题的范围,目的