问题标签 [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.

0 投票
1 回答
1033 浏览

expression - 为什么一元运算符具有结合性

在像“10 - 3 - 2”这样的表达式中,很容易理解为什么 - 和 + 运算符是关联的。为了匹配数学约定,结果是 5 而不是 9。据我了解,关联性是指某些运算符具有相同优先级时的顺序。

但这与一元运算符有什么关系呢?我不明白为什么一元运算符具有关联性。

注意:这个问题是关于一般编程的,但如果你必须以依赖于语言的方式回答,C 是首选。

0 投票
1 回答
29 浏览

programming-languages - 浮点运算的关联性

当涉及到浮点时,我试图了解操作的关联性。在我的讲义中,陈述如下:

“假设浮点值存储七位精度。考虑将 11 个数字相加的问题,其中一个数字是 10^7,另外十个是 1。

如果将小数(1)分别添加到大数中,一次一个,对那个数字没有影响,因为小数出现在大数的第八位“。所以在这里我明白了结果是 1,000,001。

“但是,如果先将小数相加,然后将结果与大数相加,则结果为七位精度 1.000001 * 10^7”

但在我看来,这两种方法都是一样的:我们将 10 个数字加到更大的数字上。有人可以澄清这个问题吗?谢谢

0 投票
4 回答
409 浏览

java - 对 post++ 和 --pre 运算符的操作

我想知道递增postpre递减操作。

我在is和isJava之前所知道的。而运算符的关联性是post operatorhighassociativityleft-to-rightpreright-to-left

在此处输入图像描述

Oracle Java 教程

但是我的代码向我显示了不希望的结果-

0 投票
2 回答
521 浏览

c++ - C ++:*(乘法)运算符的关联性不是从左到右

在完成学校作业时,我们不得不对运算符重载和模板做一些事情。都很酷。我写:

然后一位朋友问我为什么他的代码以“错误”的顺序产生输出。他有类似的东西

打印调试信息的代码r->evaluate(),之前l->evaluate()。我也在我的机器上对其进行了测试,只需将这三行更改为单行即可。

所以,我想,那么*应该是从右到左的联想。但是互联网上到处都说它是从左到右的。有一些额外的规则吗?使用模板时可能有什么特别之处?还是这是 VS2012 中的错误?

0 投票
1 回答
93 浏览

javascript - JavaScript 中包含两个赋值运算符的复合表达式的求值过程

这是一个包含两个赋值运算符的复合表达式:

棘手的部分是第三行:

恕我直言,赋值运算符=是右关联的,因此表达式的嵌套结构是:

但是根据ES5 Annex D,ES5 中的评估顺序总是从左到右。

根据ES5 第 11.13.1 节

产生式AssignmentExpression : LeftHandSideExpression = AssignmentExpression的评估如下:

  1. lref为评估LeftHandSideExpression的结果。
  2. rref为评估AssignmentExpression的结果。
  3. rval为 GetValue( rref )。
  4. 如果以下条件都为真,则抛出SyntaxError异常: ....有意省略以节省空间
  5. 放置值(lrefrval)。
  6. 返回rval

所以我对从左到右的评估顺序的理解是:

  1. 首先评估并为其a.x返回参考lref1
  2. 计算a = {m: 2}得到rref1,因为它也是一个赋值表达式,我们将再次启动该过程(如递归)

    2.1。首先评估并为其 a返回参考lref2

    2.2. 评估{m: 2}并将对象返回{m: 2}rref2

    2.3. 让rval2= GetValue(rref2)rval2对象也是{m: 2}

    2.4. PutValue(lref2, rval2), 所以a将重新绑定对象{m: 2}而不是{n: 1}

    2.5. return rval2,即对象{m: 2}rref1(不是引用类型,而是对象)

  3. rval1= GetValue(rref1),这也是对象{m: 2}

  4. PutValue(lref1, rval1),所以lref1所指的内存地址就是{m: 2}。并且b.x仍然引用此地址并将b更新。

此过程符合 ES5 Spec 并很好地解释了结果。

我的问题是:

  1. 上述评价顺序是真是假?如果是假的,还有其他解释吗?

  2. 如何正确理解 ES5 中的参考规范类型?它只是一个指向某个内存地址的中间指针吗?

0 投票
2 回答
227 浏览

java - 如何解释这种运算符关联性?

根据此表++具有从右到左的关联性。所以,我运行这段代码:

并期望表达式是50(因为8 + 7 * 6,增量从右到左开始)。6 + 7 * 8但是该表达式由 Eclipse从左到右 ( ) 进行评估,并给出结果为62. 我对 Java 中的这种关联性很陌生,并且一定遗漏了一些明显的东西。请帮助我理解这种奇怪的行为。

编辑:谢谢你的回答,但我现在还有一个问题。从@bizclop 的代码和树答案中可以看出,很明显,关联++性无关紧要。那么, /的这种关联性是否有任何用例?++--

0 投票
1 回答
115 浏览

c - 请解释这个简单的 C 程序的输出

这是一个来自 yashwant kanetkar 的简单 c 程序,但我无法理解答案。如果我们编译这个程序,我得到的输出是

这是一个非常简单的程序,但我无法解释输出可能是我对关联性感到困惑。/ 和 * 都具有 L 到 R 的关联性,并且只有 / 具有明确的左操作数(L 到 R 关联性的必要条件),它是较早执行的。但在那种情况下答案是不同的。

0 投票
3 回答
599 浏览

r - R中从右到左的运算符关联性是否可能?

我是 R 新手,我刚刚发现我患有括号恐惧症(请参阅链接中的评论)。我喜欢magrittr符号的%>%工作方式,因为它在某些情况下避免了嵌套括号,并使代码更具可读性。我来自Mathematica,那里有一个非常相似的本地//表示法来做什么%>%。以下是一些 R 和 Mathematica 的比较:

到目前为止一切顺利,但是,我的问题是:

有什么方法可以模仿Mathematica @ notation,并具有从右到左的关联性R

这是它在 Mathematica 中的工作原理,用于解决上面的相同代码:

在 Mathematica 中也可以写成:

就像R里面一样:

但是这样的东西会更干净(和酷)R

PS:我知道@在 S4 课程中使用,并不是一个好主意。这只是一个说明性的比较。

0 投票
2 回答
177 浏览

c - 该语句的评估优先级是什么?

这是考试中的一个问题,如果P指向数组中的任何元素的指针,请解释该语句的真正作用。

我什至写了一个简单的代码来评估它:

但输出让我更加困惑:

看起来它首先取消引用P,然后增加它的值,然后减少指针的值P,但为什么呢?

根据 p53 中的 K&R 表 2-1(见下图)++、- 和 *(取消引用)从右到左具有相同的优先级和关联性。所以第一步应该是减少 的值P然后取消引用,然后增加取消引用的值,我错了吗?

在此处输入图像描述

0 投票
3 回答
3146 浏览

c - C中函数调用运算符的关联性

我正在讨论 C 运算符的关联性这一主题。

在那里我遇到了这样一个事实,即函数调用运算符()具有从左到右的关联性。但是只有当一个表达式中出现多个具有相同优先级的运算符时,关联性才会发挥作用。但是我找不到任何涉及函数调用运算符的示例,其中关联性起着至关重要的作用。

例如在语句a = f(x) + g(x);中,结果取决于评估顺序而不是两个函数调用的关联性。同样,调用f(g(x))将首先评估 function g(),然后是 function f()。在这里,我们有一个嵌套的函数调用,并且关联性再次不起作用。

此优先级组中的其他 C 运算符是数组下标[]和。但是我找不到任何涉及这些运算符组合的示例,其中关联性在表达式评估中起作用。 postfix ++postfix --()

所以我的问题是函数调用的关联性被定义为从左到右是否会影响 C 中的任何表达式?任何人都可以提供一个例子,说明函数调用运算符的关联性()在表达式评估中很重要吗?