改变运算符优先级的不同结果

时间:2018-07-13 03:44:01

标签: c++

我正在分析为什么a.b / c和a / b.c在不同情况下给出不同的结果。 除了运算符的优先级之外,是否有人向我解释原因。

int d = a * b / c;

int e = a / b * c;

cout << d <<“” << e;

3 个答案:

答案 0 :(得分:2)

乘法和除法运算符不能位于彼此前面。在这种情况下,乘法表达式的从左到右的关联变得很重要。

在大多数情况下,a × b ÷ c ≠ a ÷ b × c只是一个数学事实。

例如:

  10 × 5 ÷ 2
= 50 ÷ 2
= 25

  10 ÷ 5 × 2
= 2 × 2
= 4

另请参阅:

答案 1 :(得分:1)

产品的优先级和划分相同。但是,将它们混合时,会从左到右成对评估。例如:

D = a×b÷c

评估为:(a×b)÷c

D = b÷c×a

被评估为(b÷c)×a

从数学上讲,两者是等效的。但是,在编程语言中,它们可能有所不同。例如,如果a,b和c是整数,则所涉及的除法就是整数除法。

因此,如果a,b和c大于1并且c不能精确地除以乘积a×b,那么

a×b÷c!= b÷c×a

由于整数除法在等式的两边都丢弃了不同的量。

最后,您提供的特定样本表达式即使在使用实数时也会产生不同的结果,因为它们在数学上是不同的。

答案 2 :(得分:1)

与此问题相关的概念有两个,操作员优先关联顺序

当所使用的运算符具有不同的优先级时,运算符优先级开始起作用。

但是当运算符具有相同的优先级时,编译器的关联顺序就会起作用。

考虑这个表达式,

a*b/c

如果编译器从左到右读取它,即从左到右关联,则该表达式的计算结果为

(a*b)/c

如果编译器从右到左读取它,即从右到左关联性,则该表达式的计算结果为

a*(b/c)

因此,表达式

a*b/c and a/b*c

将被不同地评估,因为编译器将从左向右或从右向左读取。

在两种情况下,表达式的求值方式都不同。