我正在分析为什么a.b / c和a / b.c在不同情况下给出不同的结果。 除了运算符的优先级之外,是否有人向我解释原因。
int d = a * b / c;
int e = a / b * c;
cout << d <<“” << e;
答案 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
将被不同地评估,因为编译器将从左向右或从右向左读取。
在两种情况下,表达式的求值方式都不同。