C ++和PEMDAS优先顺序/操作顺序?

时间:2018-08-29 22:47:51

标签: c++

我有一个问题无法找到答案,我正在寻求澄清。

据我了解,C ++遵循PEMDAS,这是正确的吗?

因此,如果我执行类似5/9 * (34/.2)的操作,则由于括号位于结尾而不是开头,因此很难计算此公式。这是正确的吗?

当我执行(34/.2) *5/9时,我的公式起作用。

任何提示,指示和指导都值得赞赏。我觉得我真的迷路了。

2 个答案:

答案 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