在数学中,如果三个矩阵,'A','B'和'C'相乘,那么第四个矩阵'D = A * B * C',则必须计算的权利。左的。使用括号来澄清,前面的陈述完全等同于以下内容; 'D =(A *(B * C))'。
你可以看到它如何适用于表达式'{M = A * B * C * D} == {M =(A *(B *(C *(D))))}',这是另一个示例
在C,C ++中,我使用除法运行测试来检查在C和C ++中完成操作的顺序。
但是,编译汇编代码可能有更好的方法:
float a = 1.0;
float b = 2.0;
float c = 2.0;
float ans = a / b / c;
printf("answer is %f\n", ans);
这给出了输出:
answer is 0.25
这告诉我,如果我要创建一个表示矩阵的类,那么乘法的顺序将是从左到右,与所需的相反,因为具有浮动的示例点操作和除法从左到右进行评估,因为这三个操作具有相同的优先级。
在OpenGL数学库GLM中,矩阵运算以正确的顺序计算,不需要括号。
operator *()如何以这种方式运行?
呃,是的,所以它实际上并不重要,因为它已被指出给我。在这种情况下,我的问题变成“是否可以改变订单”? (也许我困了?)
答案 0 :(得分:6)
C ++ /
和二进制*
运算符都是从左到右关联的。故事结束 - 没有办法改变这一点。
Matrix multiplication is associative,所以这不应该影响你。
答案 1 :(得分:3)
原因很简单:矩阵乘法是关联的;标量除法不。 (A / (B / C))
与((A / B) / C)
不同。但对于矩阵和标量乘法,(A * (B * C))
与((A * B) * C)
相同。
因此,C ++调用运算符的顺序与矩阵乘法无关。