我有一个问题无法找到答案,我正在寻求澄清。
据我了解,C ++遵循PEMDAS,这是正确的吗?
因此,如果我执行类似5/9 * (34/.2)
的操作,则由于括号位于结尾而不是开头,因此很难计算此公式。这是正确的吗?
当我执行(34/.2) *5/9
时,我的公式起作用。
任何提示,指示和指导都值得赞赏。我觉得我真的迷路了。
答案 0 :(得分:1)
C++ Operator Precedence cppreference页面包含c ++中所有操作的顺序。一次消化所有内容有点困难,但是对于简单的数学运算,您需要关注第5行和第6行。
是的,您可以说C ++在某种程度上遵循了PEMDAS,但它没有指数运算符(请参见std::pow)。但是要澄清的是,乘法和除法的优先级相同(从左至右评估),加法和减法(从左至右)也是
假设您在5/9 * (34/.2)
中表示5/9
是一个分数,换句话说,(34/.2)
不在分母5/9 * (34/.2)
和(34/.2) * 5/9
中理论上应该对同一件事进行评估,对吗?
之所以没有,是因为整数除法。当您编写5/9
时,应该得到的是0.555556,但是由于5和9都是整数,所以/运算符仅返回结果的整数部分,在这种情况下为0。但是,当您首先评估括号时,首先将整数除以非整数值(在这种情况下为double)。这将返回一个double结果,当将其乘以5时会得到另一个double结果,并且将其除以9不会进行整数除法(因为第一个操作数是double)。
要澄清的问题不是命令顺序错误,这是由于意外的整数除法。您可以通过将5更改为5.0来解决此问题。这样,它是一个双精度值,并且/运算符将永远不会进行整数除。
答案 1 :(得分:1)
简单的答案是“是”,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