从左到右的结合意味着什么?

Fra*_*cis 24 c++ glm-math

我对从左到右和从右到左的相关性的定义感到困惑.我也看到他们被称为左关联和右关联,并想知道哪个对应哪个.

我知道它与执行具有相同优先级的操作的顺序有关,如a = x*y*z是指a = x*(y*z)还是a =(x*y)*z.我不知道哪一个是从左到右的关联,哪个是从右到左的关联.

我已经尝试了谷歌它,但我能找到的是不同运算符在c ++中的相关性的表格.看看所有的例子让我更加困惑.

让我更进一步困惑的是:

glm::vec4 transformedVector = translationMatrix * rotationMatrix * scaleMatrix * originalVector;
Run Code Online (Sandbox Code Playgroud)

首先预先形成缩放矩阵乘法,然后是旋转矩阵,然后是平移.在这个例子中,矩阵都是glm :: mat4类型,向量是glm :: vec4类型.这是从左到右还是从右到左的关联性?这与正常乘法相同还是glm类型的乘法不同?

dje*_*lin 22

你通常从左到右阅读.你通常从左到右做数学.这是左右相关性,这是最常见的.

大多数人都会解决

x = 23 + 34 + 45
Run Code Online (Sandbox Code Playgroud)

通过分组

x = (23 + 34) + 45
Run Code Online (Sandbox Code Playgroud)

这是从左到右的关联性.你可以记住它,因为你从左到右阅读并做数学.

对于除了在数学这件事简化版,太多.你总是得到相同的结果.这是因为加法是关联的.说一个操作是关联意味着从左到右和从右到左的关联是相同的事情.对于另外编程它仍然很重要,因为溢出和浮点运算的(但不会在任何合理的语言正常大小的整数),所以当你有大量的和轻率使用的凌晨2点错误a+bb+a,记住什么样的顺序添加发生在.

在你的例子中:

glm::vec4 transformedVector = translationMatrix * rotationMatrix * scaleMatrix * originalVector
Run Code Online (Sandbox Code Playgroud)

概念上讲,你首先从右侧开始,因为那是你所采取行动的地方.但是在C++中,*通常是从左到右的关联,并且不可能覆盖它.glm可以通过多种方式处理这个问题:它可以构建一个缓存的东西来等待最终的向量到达,然后从右到左进行乘法.它也可能(更有可能)使用矩阵乘法完全关联的代数定理,然后从左到右乘以,然后向文档中的读者保证它与从右到左的思维方式相同.但是,您需要了解实现,因为如前所述,实现选择将浮点数乘以的方式很重要.

为了完整性,请考虑减法.什么是a - b - c?这真的不论是向左或向右关联.当然在数学中我们将它定义为b (a - b) - c,但是一些奇怪的编程语言可能更喜欢减法是正确的联想,并且a - b - c总是意味着a - (b - c).这种外来语言最好有一个文档页面,指定它-是右关联的,因为它是操作规范的一部分,而不是你可以简单地通过查看操作符的使用来判断.


thu*_*zhf 6

您可以从以下单词中看到:

当我们将运算符组合成表达式时,运算符的应用顺序可能并不明显.例如,a + b + c可以解释为((a + b)+ c)或(a +(b + c)).如果操作数从左到右分组,我们说+是左关联的,如((a + b)+ c).我们说它是右关联的,如果它将操作数分组在相反的方向,如(a +(b + c)).

AV Aho和JD Ullman 1977,p.47


kil*_*joy 5

我发现的最简单和最非 tl;dr 的答案:

在大多数编程语言中,加法、减法、乘法和除法运算符是左结合的,而赋值、条件和指数运算符是右结合的

感谢: http: //www.computerhope.com/jargon/a/assooper.htm