我有一个问题,我找不到答案,我正在寻找一些澄清。
根据我的理解,C++遵循PEMDAS,这是正确的吗?
因此,如果我做类似5/9 * (34/.2)
,由于括号位于末尾而不是前面,因此很难计算此公式。这是对的吗?
当我做(34/.2) *5/9
时,我的公式有效。
任何提示,指针,指导不胜感激。我觉得我真的迷失在这里。
C++运算符优先级 cpp首选项页包含 c++ 中所有操作的顺序。一下子消化有点困难,但对于简单的数学运算,您关心的是行 #5 和 #6。
所以是的,你可以说C++在某种程度上遵循PEMDAS,除了它没有指数运算符(参见std::p ow(。但澄清一下,乘法和除法具有相同的优先级(从左到右评估(,加法和减法(也是从左到右(也是如此
假设你的意思是5/9 * (34/.2)
5/9
是分数,或者换句话说,(34/.2)
不在分母中,理论上5/9 * (34/.2)
和(34/.2) * 5/9
应该评估同一件事,对吧?
他们不这样做的原因是因为整数除法。当你写5/9
你应该得到的是 0.555556,但由于 5 和 9 都是整数,/运算符只返回结果的整数部分,在本例中为 0。但是,当您首先计算括号时,首先将整数除以非整数值(在本例中为双精度值(。这将返回一个双精度结果,当乘以 5 时,会得到另一个双精度结果,将其除以 9 不会进行整数除法(因为第一个操作数是双精度数(。
重新澄清错误不是顺序错误,而是因为意外的整数除法。您可以通过将 5 更改为 5.0 来解决此问题。这样,它是一个双精度值,/运算符永远不会进行整数除法。
简单的答案是"是"C++遵循标准的优先级顺序。
我要指出的是,在PEMDAS中,E代表"指数",并且无法表达C++中您需要进行函数调用才能实现它,但其余部分是正确的。
Definition:
P Parathasis first.
E Exponent second.
MD Multiplication and Division third (have the same precedence)
AS Addition and Subtraction fourth (have the same precedence)
MD happen left to right
AS happen left to right
5/9 * (34/.2(
由于括号位于末尾而不是前面,因此很难计算此公式。这是对的吗?
错。上述表达式在数学和C++中都有很好的定义,并且具有相同的含义。
(34/.2( *5/9
我的公式有效。任何提示,指针,指导不胜感激。
这些不是同一个表达方式。乘法和除法具有相同的优先级,并且从左到右应用。您更改了这些运算符的应用顺序。但是你说它们应该是联想的(即顺序并不重要(。这是事实。但是您还必须输入类型信息。容易忘记的一件事是整数除法不是你所期望的(它丢弃了余数(。
版本1:
5/9 * (34/.2)
34/.2 => P1 170.0
5/9 => P2 0 // Integer division
P2 * P1 => P3 0
版本 2
(34/.2) *5/9
34/.2 => P1 170.0
P1 * 5 => P2 850.0
P2 / 9 => P3 94.4