问题标签 [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.
python - Python中比较运算符的关联性
Python中比较运算符的关联性是什么?三个比较很简单,但除此之外,我不确定它是如何做到的。它们似乎不是右联想或左联想。
例如:
所以,不是左联想。
所以它也不是右结合的。
我已经看到一些地方他们被“束缚”了,但是这如何与四个或更多比较一起工作?
c++ - 自定义类型的运算符优先级,当存在多个相同运算符时是否可以进行惰性求值?
假设array
是一个自定义类型,定义为本质上管理资源的类
为了使operator -
to 执行元素级标量加法array
并能够处理左右关联性array+float
和float+array
,我们像这样重载它
假设我们也有一个initializer_list
构造函数,所以我们可以做
现在为
我们得到了想要的结果,但是这样做
甚至不调用第二个重载marray-5.0
,并为输出数组的最后两个元素提供无意义的值,当然2.0-(marray-5.0)
确实解决了问题,但不是通用解决方案。所以问题是:
- 引擎盖下到底发生了什么,为什么根本不调用第二个重载?这与运算符优先级有关吗?
- 我的第二个问题是关于第二种情况,即
2.0-(marray-5.0)
在这里我们调用一次运算符 for thefloat+array
和一次 forarray+float
。所以数组被遍历了两次。当存在多个相同运算符和/或多个运算符的倍数时,是否可以进行惰性评估以一次执行全局操作?
编辑: 这是一个最小的工作示例。注意missing const
在第二个重载中,我用另一个array operator -(const array& other)
重载来消除歧义,用于两个数组的元素减法。我想这是第一个问题的原因。
parsing - LR(0) 解析器的运算符优先级
一个典型的 BNF 定义算术运算:
有没有办法重写这个语法,以便它可以用 LR(0) 解析器来实现,同时仍然保留运算符的优先级和左关联性?我认为通过引入某种消歧非终端应该是可能的,但我不知道该怎么做。
谢谢!
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
关键字创建的变量相反。这不是这里的问题。
c++ - 整数溢出和运算顺序
我最近在我的 C++ 代码上遇到了一个问题,这让我想知道我是否对编译器对长操作会做什么有一些误解……看看下面的代码:
对我来说,在这 3 行中的任何一行中发生乘法的顺序是未定义的。但是,这是我认为会发生的事情(假设int
是 32b,long long
是 64b,并且它们都遵循 IEEE 规则):
- 对于第 2 行,首先计算括号,使用
int
s 作为中间结果,导致溢出并存储 -1073741824。这个中间结果被提升为long long
最后的乘法,因此打印的结果应该是 -5368709120。 - 第 1 行和第 3 行是“等价的”,因为评估的顺序是未定义的。
现在,对于第 1 行和第 3 行,我不确定:我认为尽管评估顺序未定义,但编译器会将所有操作“提升”为最大操作数的类型,即long long
此处。因此,在这种情况下不会发生溢出,因为所有计算都将在 64b 中进行......但这就是 GCC 5.3.0 为我提供的代码:
我也希望第一个结果是 16106127360。由于我怀疑 GCC 中是否存在这种规模的编译器错误,我猜这个错误位于键盘和椅子之间。
任何人都可以确认/确认这是未定义的行为,并且 GCC 给我的任何东西都是正确的(因为这是未定义的)?
haskell - 如何在表达式中使用右结合运算?
我已经定义了自己的运算符:
它是右联想。
现在我想在下一个表达式中使用:
但我收到一个错误:
我该如何解决?
parsing - 具有关联性和自指产生式的 LL 语法
我正在尝试编写一个解析器语法,并且目前有以下 LL 语法(在 Antlr 中)的产生,并且我正在尝试解析一个或多个(数字或字符串),它由正确的关联的“#”分隔。如何修改产品,以便它可以解析一个或多个用“#”分隔的字符串,而不仅仅是一个?
此语法的语言示例:
我尝试使用 EBNF 表格
但这导致我的语法模棱两可。我将如何解决这种歧义?
c++ - C++:如何解析这条语句?
我一直在尝试学习 C++ 中运算符的关联性,并且遇到了一个代码段:
我还研究了++a
从右到左的联想和a++
从左到右的联想。也是+
从左到右关联的。但我不明白如何在这个问题中应用这些知识。
我很困惑我的编译器将如何解析这个语句?
我也很困惑,因为放置空格并不重要,为什么要删除空格,例如:
产生错误?请帮助我理解这个概念。
谢谢!
swift - 三元运算符关联性
在三元运算符的上下文中,我无法理解关联性的概念。在大多数情况下,三元运算符如下所示:
在这种情况下,不需要关联性来评估表达式。但有时,三元运算符是嵌套的:
但是,嵌套也可以反转
解释这种现象的最佳方法是什么?您能否认为:
运算符的关联性取决于上下文,或者我在这里遗漏了什么?
当一个人想要定义自己的三元运算符时,关联性问题就变得相关了,例如在 Swift 中: