问题标签 [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 投票
3 回答
602 浏览

python - Python中比较运算符的关联性

Python中比较运算符的关联性是什么?三个比较很简单,但除此之外,我不确定它是如何做到的。它们似乎不是右联想或左联想。

例如:

所以,不是左联想。

所以它也不是右结合的。

我已经看到一些地方他们被“束缚”了,但是这如何与四个或更多比较一起工作?

0 投票
1 回答
76 浏览

c++ - 自定义类型的运算符优先级,当存在多个相同运算符时是否可以进行惰性求值?

假设array是一个自定义类型,定义为本质上管理资源的类

为了使operator -to 执行元素级标量加法array并能够处理左右关联性array+floatfloat+array,我们像这样重载它

假设我们也有一个initializer_list构造函数,所以我们可以做

现在为

我们得到了想要的结果,但是这样做

甚至不调用第二个重载marray-5.0,并为输出数组的最后两个元素提供无意义的值,当然2.0-(marray-5.0)确实解决了问题,但不是通用解决方案。所以问题是:

  1. 引擎盖下到底发生了什么,为什么根本不调用第二个重载?这与运算符优先级有关吗?
  2. 我的第二个问题是关于第二种情况,即2.0-(marray-5.0)在这里我们调用一次运算符 for thefloat+array和一次 for array+float。所以数组被遍历了两次。当存在多个相同运算符和/或多个运算符的倍数时,是否可以进行惰性评估以一次执行全局操作?

编辑: 是一个最小的工作示例。注意missing const在第二个重载中,我用另一个array operator -(const array& other)重载来消除歧义,用于两个数组的元素减法。我想这是第一个问题的原因。

0 投票
1 回答
363 浏览

parsing - LR(0) 解析器的运算符优先级

一个典型的 BNF 定义算术运算:

有没有办法重写这个语法,以便它可以用 LR(0) 解析器来实现,同时仍然保留运算符的优先级和左关联性?我认为通过引入某种消歧非终端应该是可能的,但我不知道该怎么做。

谢谢!

0 投票
3 回答
339 浏览

javascript - 多重赋值混淆

我知道赋值运算符是右结合的。

所以例如 x = y = z = 2相当于(x = (y = (z = 2)))

既然如此,我尝试了以下方法:

我希望该对象foo将使用值创建{a:1},然后x将创建该属性,该属性将foo只是对该foo对象的引用。

(如果我将多个赋值语句分成两个单独的语句,实际上会发生这种情况foo = {a:1};foo.x = foo;

结果实际上是:

ReferenceError: foo 未定义(…)

所以我尝试了以下方法:

现在我不再得到异常但foo.x未定义!

为什么作业没有按我的预期工作?


免责声明:“重复”问题似乎与我要问的问题非常不同,因为问题在于分配中创建的变量是全局的,与使用var关键字创建的变量相反。这不是这里的问题。

0 投票
2 回答
164 浏览

c++ - 整数溢出和运算顺序

我最近在我的 C++ 代码上遇到了一个问题,这让我想知道我是否对编译器对长操作会做什么有一些误解……看看下面的代码:

对我来说,在这 3 行中的任何一行中发生乘法的顺序是未定义的。但是,这是我认为会发生的事情(假设int是 32b,long long是 64b,并且它们都遵循 IEEE 规则):

  • 对于第 2 行,首先计算括号,使用ints 作为中间结果,导致溢出并存储 -1073741824。这个中间结果被提升为long long最后的乘法,因此打印的结果应该是 -5368709120。
  • 第 1 行和第 3 行是“等价的”,因为评估的顺序是未定义的。

现在,对于第 1 行和第 3 行,我不确定:我认为尽管评估顺序未定义,但编译器会将所有操作“提升”为最大操作数的类型,即long long此处。因此,在这种情况下不会发生溢出,因为所有计算都将在 64b 中进行......但这就是 GCC 5.3.0 为我提供的代码:

我也希望第一个结果是 16106127360。由于我怀疑 GCC 中是否存在这种规模的编译器错误,我猜这个错误位于键盘和椅子之间。

任何人都可以确认/确认这是未定义的行为,并且 GCC 给我的任何东西都是正确的(因为这是未定义的)?

0 投票
2 回答
328 浏览

c++ - 折叠表达式的关联性

N4191向 C++ 提出了折叠表达式。那里的定义是

是一个左折叠(即(((a0 + a1) + a2) + ...),并且

是右折叠(即(... + (a8 + (a9 + a10)))。但是,修订后的论文N4295颠倒了左右一元折叠的定义。

问题:原理是什么?从左到右进行评估似乎更直观(至少当您习惯于从左到右的字母表时)(args + ...)

0 投票
1 回答
162 浏览

haskell - 如何在表达式中使用右结合运算?

我已经定义了自己的运算符:

它是右联想。

现在我想在下一个表达式中使用:

但我收到一个错误:

我该如何解决?

0 投票
2 回答
50 浏览

parsing - 具有关联性和自指产生式的 LL 语法

我正在尝试编写一个解析器语法,并且目前有以下 LL 语法(在 Antlr 中)的产生,并且我正在尝试解析一个或多个(数字或字符串),它由正确的关联的“#”分隔。如何修改产品,以便它可以解析一个或多个用“#”分隔的字符串,而不仅仅是一个?

此语法的语言示例:

我尝试使用 EBNF 表格

但这导致我的语法模棱两可。我将如何解决这种歧义?

0 投票
2 回答
424 浏览

c++ - C++:如何解析这条语句?

我一直在尝试学习 C++ 中运算符的关联性,并且遇到了一个代码段:

我还研究了++a从右到左的联想和a++从左到右的联想。也是+从左到右关联的。但我不明白如何在这个问题中应用这些知识。

我很困惑我的编译器将如何解析这个语句?

我也很困惑,因为放置空格并不重要,为什么要删除空格,例如:

产生错误?请帮助我理解这个概念。

谢谢!

0 投票
1 回答
1557 浏览

swift - 三元运算符关联性

在三元运算符的上下文中,我无法理解关联性的概念。在大多数情况下,三元运算符如下所示:

在这种情况下,不需要关联性来评估表达式。但有时,三元运算符是嵌套的:

但是,嵌套也可以反转

解释这种现象的最佳方法是什么?您能否认为:运算符的关联性取决于上下文,或者我在这里遗漏了什么?

当一个人想要定义自己的三元运算符时,关联性问题就变得相关了,例如在 Swift 中: