问题标签 [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 operator
high
associativity
left-to-right
pre
right-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
返回参考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
(不是引用类型,而是对象)让
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 中的任何表达式?任何人都可以提供一个例子,说明函数调用运算符的关联性()
在表达式评估中很重要吗?