问题标签 [associativity]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
expression - 为什么一元运算符具有结合性
在像“10 - 3 - 2”这样的表达式中,很容易理解为什么 - 和 + 运算符是关联的。为了匹配数学约定,结果是 5 而不是 9。据我了解,关联性是指某些运算符具有相同优先级时的顺序。
但这与一元运算符有什么关系呢?我不明白为什么一元运算符具有关联性。
注意:这个问题是关于一般编程的,但如果你必须以依赖于语言的方式回答,C 是首选。
programming-languages - 浮点运算的关联性
当涉及到浮点时,我试图了解操作的关联性。在我的讲义中,陈述如下:
“假设浮点值存储七位精度。考虑将 11 个数字相加的问题,其中一个数字是 10^7,另外十个是 1。
如果将小数(1)分别添加到大数中,一次一个,对那个数字没有影响,因为小数出现在大数的第八位“。所以在这里我明白了结果是 1,000,001。
“但是,如果先将小数相加,然后将结果与大数相加,则结果为七位精度 1.000001 * 10^7”
但在我看来,这两种方法都是一样的:我们将 10 个数字加到更大的数字上。有人可以澄清这个问题吗?谢谢
java - 对 post++ 和 --pre 运算符的操作
我想知道递增post和pre递减操作。
我在is和isJava之前所知道的。而运算符的关联性是post operatorhighassociativityleft-to-rightpreright-to-left

但是我的代码向我显示了不希望的结果-
c++ - C ++:*(乘法)运算符的关联性不是从左到右
在完成学校作业时,我们不得不对运算符重载和模板做一些事情。都很酷。我写:
然后一位朋友问我为什么他的代码以“错误”的顺序产生输出。他有类似的东西
打印调试信息的代码r->evaluate(),之前l->evaluate()。我也在我的机器上对其进行了测试,只需将这三行更改为单行即可。
所以,我想,那么*应该是从右到左的联想。但是互联网上到处都说它是从左到右的。有一些额外的规则吗?使用模板时可能有什么特别之处?还是这是 VS2012 中的错误?
javascript - JavaScript 中包含两个赋值运算符的复合表达式的求值过程
这是一个包含两个赋值运算符的复合表达式:
棘手的部分是第三行:
恕我直言,赋值运算符=是右关联的,因此表达式的嵌套结构是:
但是根据ES5 Annex D,ES5 中的评估顺序总是从左到右。
产生式AssignmentExpression : LeftHandSideExpression = AssignmentExpression的评估如下:
- 令lref为评估LeftHandSideExpression的结果。
- 令rref为评估AssignmentExpression的结果。
- 设rval为 GetValue( rref )。
- 如果以下条件都为真,则抛出SyntaxError异常: ....有意省略以节省空间
- 放置值(lref,rval)。
- 返回rval。
所以我对从左到右的评估顺序的理解是:
- 首先评估并为其
a.x返回参考lref1 计算
a = {m: 2}得到rref1,因为它也是一个赋值表达式,我们将再次启动该过程(如递归)2.1。首先评估并为其
a返回参考lref22.2. 评估
{m: 2}并将对象返回{m: 2}为rref22.3. 让
rval2=GetValue(rref2),rval2对象也是{m: 2}2.4.
PutValue(lref2, rval2), 所以a将重新绑定对象{m: 2}而不是{n: 1}2.5. return
rval2,即对象{m: 2}为rref1(不是引用类型,而是对象)让
rval1=GetValue(rref1),这也是对象{m: 2}PutValue(lref1, rval1),所以lref1所指的内存地址就是{m: 2}。并且b.x仍然引用此地址并将b更新。
此过程符合 ES5 Spec 并很好地解释了结果。
我的问题是:
上述评价顺序是真是假?如果是假的,还有其他解释吗?
如何正确理解 ES5 中的参考规范类型?它只是一个指向某个内存地址的中间指针吗?
java - 如何解释这种运算符关联性?
根据此表,++具有从右到左的关联性。所以,我运行这段代码:
并期望表达式是50(因为8 + 7 * 6,增量从右到左开始)。6 + 7 * 8但是该表达式由 Eclipse从左到右 ( ) 进行评估,并给出结果为62. 我对 Java 中的这种关联性很陌生,并且一定遗漏了一些明显的东西。请帮助我理解这种奇怪的行为。
编辑:谢谢你的回答,但我现在还有一个问题。从@bizclop 的代码和树答案中可以看出,很明显,关联++性无关紧要。那么, /的这种关联性是否有任何用例?++--
c - 请解释这个简单的 C 程序的输出
这是一个来自 yashwant kanetkar 的简单 c 程序,但我无法理解答案。如果我们编译这个程序,我得到的输出是
这是一个非常简单的程序,但我无法解释输出可能是我对关联性感到困惑。/ 和 * 都具有 L 到 R 的关联性,并且只有 / 具有明确的左操作数(L 到 R 关联性的必要条件),它是较早执行的。但在那种情况下答案是不同的。
r - R中从右到左的运算符关联性是否可能?
我是 R 新手,我刚刚发现我患有括号恐惧症(请参阅链接中的评论)。我喜欢magrittr符号的%>%工作方式,因为它在某些情况下避免了嵌套括号,并使代码更具可读性。我来自Mathematica,那里有一个非常相似的本地//表示法来做什么%>%。以下是一些 R 和 Mathematica 的比较:
到目前为止一切顺利,但是,我的问题是:
有什么方法可以模仿Mathematica @ notation,并具有从右到左的关联性R?
这是它在 Mathematica 中的工作原理,用于解决上面的相同代码:
在 Mathematica 中也可以写成:
就像R里面一样:
但是这样的东西会更干净(和酷)R:
PS:我知道@在 S4 课程中使用,并不是一个好主意。这只是一个说明性的比较。
c - 该语句的评估优先级是什么?
这是考试中的一个问题,如果P指向数组中的任何元素的指针,请解释该语句的真正作用。
我什至写了一个简单的代码来评估它:
但输出让我更加困惑:
看起来它首先取消引用P,然后增加它的值,然后减少指针的值P,但为什么呢?
根据 p53 中的 K&R 表 2-1(见下图)++、- 和 *(取消引用)从右到左具有相同的优先级和关联性。所以第一步应该是减少 的值,P然后取消引用,然后增加取消引用的值,我错了吗?

c - C中函数调用运算符的关联性
我正在讨论 C 运算符的关联性这一主题。
在那里我遇到了这样一个事实,即函数调用运算符()具有从左到右的关联性。但是只有当一个表达式中出现多个具有相同优先级的运算符时,关联性才会发挥作用。但是我找不到任何涉及函数调用运算符的示例,其中关联性起着至关重要的作用。
例如在语句a = f(x) + g(x);中,结果取决于评估顺序而不是两个函数调用的关联性。同样,调用f(g(x))将首先评估 function g(),然后是 function f()。在这里,我们有一个嵌套的函数调用,并且关联性再次不起作用。
此优先级组中的其他 C 运算符是数组下标[]和。但是我找不到任何涉及这些运算符组合的示例,其中关联性在表达式评估中起作用。 postfix ++postfix --()
所以我的问题是函数调用的关联性被定义为从左到右是否会影响 C 中的任何表达式?任何人都可以提供一个例子,说明函数调用运算符的关联性()在表达式评估中很重要吗?