为什么结合性是运算符的基本属性,而不是优先级的基本属性

2024-01-22

在任何编程语言教科书中,我们总是被告知该语言中的每个运算符如何具有左结合性或右结合性。结合性似乎是任何运算符的基本属性,无论其需要多少操作数。在我看来,我们可以将任何关联性分配给任何运算符,无论我们如何将关联性分配给其他运算符。

但为什么会这样呢?也许举个例子更好。假设我想设计一种假设的编程语言。以这种任意方式为这些运算符分配关联性是否有效(全部具有相同的优先级):

unary operator: 
! right associative 
binary operators:
+ left associative
- right associative
* left associative 
/ right associative

! + - * / 是我的 5 个运算符,它们都具有相同的优先级。

如果是,那么像 2+2!3+5*6/3-5!3!3-3*2 这样的表达式如何被我的假设解析器括起来?以及为什么。

EDIT:

第一个示例 (2+2!3+5*6/3-5!3!3-3*2) 不正确。也许忘记一元操作,让我这样说,我们可以像上面那样分配具有相同优先级不同结合性的运算符吗?如果是,如何评估 2+3-4*5/3+2 的示例?因为大多数编程语言似乎都为具有相同优先级的运算符分配相同的结合性。但我们总是谈论运算符关联性,就好像它是单个运算符的属性,而不是优先级的属性。


让我们记住关联性的含义。采取任何运算符,例如@。众所周知,它的结合性是消除形式表达式歧义的规则a @ b @ c: if @是左结合的,它被解析为(a @ b) @ c;如果它是右结合词,a @ (b @ c)。它也可以是非关联的,在这种情况下a @ b @ c是一个语法错误。

如果我们有两个不同的运算符呢?@ and #?如果其中一个的优先级高于另一个,则无需多说,关联性无需做任何工作;优先级负责消除歧义。然而,如果它们具有相同的优先级,我们就需要关联性来帮助我们。简单的情况分为三种:

  • 如果两个运算符都是左结合的,a @ b # c means (a @ b) # c.
  • 如果两个运算符都是右结合的,a @ b # c means a @ (b # c).
  • 如果两个运算符都是非结合的,那么a @ b @ c是一个语法错误。

在其余情况下,运算符不同意关联性。哪个操作员的选择优先?您可能会设计这样的关联性优先规则,但我认为最自然的规则是声明任何此类情况语法错误。毕竟,如果两个运算符具有相同的优先级,为什么其中一个运算符的结合优先级高于另一个运算符呢?

根据我刚刚给出的自然规则,您的示例表达式是语法错误。

现在,我们当然可以为相同优先级的运算符分配不同的结合性。但是,这意味着存在相同优先级的运算符组合(例如您的示例!),这是语法错误。大多数语言设计者似乎更愿意避免这种情况,并将相同的结合性分配给所有具有相同优先级的运算符;这样,所有组合都是合法的。我认为这只是美学。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么结合性是运算符的基本属性,而不是优先级的基本属性 的相关文章

  • 俄语编程语言“Rapira”的现代实现? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有俄语 Rapira 编程语言的现代 1990 年以后 实现 维基百科没有提及 这个问题让我回想起
  • GoogleTalk 应用程序是用什么编程语言开发的?

    有谁知道 Google Talk 应用程序是用哪种编程语言开发的 是的 我询问的是 Windows 客户端应用程序 http www google ro talk http www google ro talk googletalk exe
  • Windows 开箱即用支持的语言

    我被要求为一组 Windows 机器 我认为是 XP 编写一个 非常 简单的程序 如此简单以至于语言的选择并不是真正的问题 但是 我希望能够分发直接在 Windows 计算机上运行的二进制文件 脚本 而不需要预先安装任何解释器或虚拟机 我正
  • 在 C# 中将字符串值转换为运算符

    我正在尝试找出一种动态构建条件的方法 到目前为止 这是我的代码 var greaterThan gt var a 1 var b 2 if a Convert ToOperator greaterThan b 我确实读过这篇文章 但不知道如
  • 奇数运算符优先级/关联性行为[重复]

    这个问题在这里已经有答案了 在 Python 2 7 中 下面的内容是怎么回事 True w in what 两者的行为都不同 True w in what and True w in what gt gt gt True w in wha
  • C++:输入和输出流运算符:结合性

    输入 输出流运算符理论上的结合性 左到右 例如 根据这个 圣玛丽大学网站 http cs smu ca porter csc ref cpp operators html 输入 输出流运算符结合性实践 include
  • 如何使用谷歌趋势查找编程语言流行总体趋势的统计数据

    我喜欢关注趋势浏览器 操作系统 语言等 我发现谷歌趋势是一个非常有用的资源有时但有时我无法获得我想要的信息 与多年来其他主要 Linux 发行版相比 Ubuntu 的增长非常明显 在发布日期附近有 6 个月度峰值 由于非编程相关事件而出现偏
  • R 中从右到左的运算符结合性可能吗?

    我是 R 新手 我刚刚发现我患有支架恐惧症 https mathematica stackexchange com a 17315 2266 请参阅链接中的评论 我喜欢这种方式magrittr符号 gt 有效 因为它在某些情况下避免了嵌套括
  • const 变量悖论

    如果我有一些关于 C 的表达式 const int x 3 我可以说 x 是一个变量吗 这看起来很奇怪 因为 x 不是变量 因为我无法更改它 提前感谢您的任何解释 Edited附 感谢您的所有回答 我明白根据 C 的定义 我的问题的答案可能
  • Delphi - 相当于C#的三元运算符? [复制]

    这个问题在这里已经有答案了 可能的重复 Delphi 中是否存在或者将来是否存在条件运算符 https stackoverflow com questions 2108609 is there or is there ever going
  • 哪些编程语言不被视为高级语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在信息学理论中 我一直听到和读到有关高级和低级语言的内容 然而我不明白为什么这仍然相关 因为除了今天使用的汇编语言之外 没有任何 相关的 低级语
  • 为什么涉及用户变量的表达式的求值顺序未定义?

    From MySQL手册 http dev mysql com doc refman 5 7 en user variables html以下查询的输出不保证始终相同 SET a 0 SELECT a AS first a a 1 AS s
  • PHP别名@函数

    我是 PHP 新手 看到一些使用 前缀调用函数 如 mysql ping 的示例 我感到很困惑 它是做什么用的 谷歌搜索 搜索没有太大帮助 因为 被丢弃并且 别名 不是足够好的关键字 抑制错误 警告和通知 如果你用自定义的方式补充它 你可以
  • 在 APL 中有效执行 scanl 的正确方法是什么?

    继我的上一个问题 https stackoverflow com questions 70272288 what is the space time complexity of the scan operator in apl 看起来 AP
  • Java OR 运算符优先级

    如何在 Java 中以 if 的方式链接条件语句b是假的 不如不检查c If a and c是假的 并且b是真的 确实c会被检查吗 if a b c 我正在寻找 PHP 所拥有的类似功能 但两者之间存在差异OR and 爪哇 如果左操作数是
  • 泛化 R %in% 运算符以匹配元组

    前几天我花了一段时间寻找一种方法来检查行向量是否包含在 R 中的某些行向量集中 基本上 我想概括 in 运算符来匹配元组而不是向量中的每个条目 例如 我想要 row vec c A 3 row vec 1 A 3 data set rbin
  • 如果该值未在语句中的其他任何地方使用,为什么要使用 ++i 而不是 i++?

    我很清楚在 C 中 int someValue i array i otherValue 相比之下有不同的效果 int someValue i array i otherValue 但每隔一段时间我就会看到 for 循环中带有前缀增量的语句
  • 赋值运算符左/右侧的不同切片行为

    作为一个来自 C 背景的 Python 新手 Python 3 4 x 中的切片运算符对我来说看起来很荒谬 我只是不明白 特殊规则 背后的设计理念 让我解释一下为什么我说它 特别 一方面 根据 Stack Overflow 的回答here
  • 解释型语言的优点和缺点是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我现在正在学习Perl 解释型语言的优点和缺点是什么 公然抄袭维基百科 http en wikipedia org wiki Inte
  • 找到将一个数字转换为另一个数字的最小移动次数的算法

    假设我们有两个正整数 a 和 b 每次移动我们都可以将 a 除以 2 但前提是 a 是偶数 将 a 乘以 2 或者将 a 加 1 将a变为b需要多少步 找到一个直接公式或一种有效的算法 即以对数时间运行的算法 我取得的一些进展 我们可以把它

随机推荐

  • 如何列出詹金斯管道脚本中目录中的所有目录

    我想从詹金斯管道脚本中获取特定目录中存在的所有目录 我们应该怎么做 如果您想要特定目录下的所有目录的列表 例如mydir使用 Jenkins Utility 插件你可以这样做 假设mydir位于当前目录下 dir mydir def fil
  • Node.js、socket.io https 连接

    服务器端代码 var io require socket io listen 8150 io sockets on connection function socket 客户端代码 var socketIO io 8150 socketIO
  • 无法在类库包中的 Entity Framework 7 beta4 上运行迁移

    我无法在类库包中执行迁移命令 我的 dnvm 版本是 来自 global json sdk version 1 0 0 beta5 12021 我正在将其导入到我的项目 JSON 中 dependencies EntityFramework
  • TypeScript 映射类型:获取数组的元素类型

    假设有一个容器类型 其数组属性为未知 生成类型T1 T2等 短T interface MultiContainer Item1 T1 Item2 T2 是否可以使用派生以下类型映射类型 https www typescriptlang or
  • Android SQLite 数据库单元测试

    我是 Android 应用程序开发的新手 我刚刚制作了一个笔记应用程序 我想对数据库的 insertNote readNote 和 updateNote 方法进行单元测试 我该怎么办 这是我的数据库的代码 谢谢 public class D
  • 迁移文件中 Django 的“primary_key”字段中的“serialize=False”是什么意思?

    我找不到原因serialize False在 Django 文档或源代码中的主键字段上设置 有什么特殊原因要设置吗 Thanks Azd325 听起来很简单 该字段不会成为序列化对象的一部分 不过 我猜您的问题与正在迁移的模型有关 并且生成
  • 如何将 IntelliJ IDEA 随机开放端口仅绑定到本地主机?

    当我在 macOS 上运行 IntelliJ IDEA 2021 1 2 终极版或社区版 时 我观察到所有网络接口 eth0 lo 上打开了 3 个随机端口 一个随机端口由 idea 进程打开 另外两个端口由 IntelliJ IDEA 启
  • AngularJS 路由控制器未重新加载

    我有一个非常简单的 AngularJS 应用程序 其中有两条路线 search results 当我从一条路线导航到另一条路线时 一切都按我的预期进行 获取所需的任何资源并完美显示内容 问题是 当我从一条路线导航到同一条路线 即 resul
  • 扫描附近的蓝牙设备

    如果手机打开了蓝牙 应用程序可以读取附近可发现设备的 ID 列表吗 如果是这样 哪个函数返回这样的列表 Thanks 看一看here http developer android com guide topics wireless blue
  • htaccess 替换查询和重定向中的字符

    我需要将查询字符串中的 替换为 而不是重定向 site com abc def to site com search php q abc def 我试过这个 RewriteRule search php q 1 2 R 301 L 以下两条
  • android项目的Maven编译错误“错误:包R不存在”

    我正在尝试使用 Android 应用程序建立一个 MAVEN 项目 我有这个pom文件
  • 类型错误:无法读取未定义的属性“redirect_uris”

    我想编写一个应用程序来处理我的一些以某种方式标记的 Gmail 电子邮件 示例代码here https github com googleapis google api nodejs client blob master samples g
  • Firestore 只同步差异吗?

    我想知道 Firestore 如何处理深度嵌套对象的实时同步 具体来说 它只同步差异吗 例如 我有一个应用程序状态 它只是一个包含 3 个值的数组 并且该状态在设备之间同步 如果我随后更改其中一个值 将同步整个新数组 在网络上传输 还是仅同
  • 如何将服务器时间转换为本地时间?

    我的 php 文件托管在世界其他地方 这date and time 函数返回服务器上的日期 时间 如何转换该日期 使其与我的本地日期 时间相同 服务器上的日期比我的当地时间晚 10 小时 我可以直接进行硬编码并从服务器时间中减去它 但什么是
  • Android INSTALL_FAILED_INVALID_URI

    当我尝试通过 Eclipse 将 Android 应用程序安装到设备时 我刚刚开始收到以下错误 Installation failed due to invalid URI Please check logcat output for mo
  • 自定义 PageControl 图像 - Swift

    我正在尝试为 UIPageControl 点设置图像 我需要更改默认点 而不是我需要图像 我使用了下面的代码 self pageCtrl currentPageIndicatorTintColor UIColor init patternI
  • Eclipse Juno 加载描述符错误

    我刚刚将 Eclipse 从 Galileo 更新为 Juno 我创建了一个新的工作区并导入了一个基于 Java Spring MVC 的项目 当我打开它时 它开始 加载描述符 然后弹出一条错误消息 加载 mta pfm 的描述符 期间发生
  • SQL查询删除两年以上的记录

    我需要通过从多个表中删除两年以上的记录来清理非常臃肿的 SQL 数据库 做到这一点最有效的方法是什么 您有什么方法可以确定记录的 年龄 吗 即 表中是否有一列代表行的年龄或可用于计算年龄的日期 如果是这样 那应该是一个简单的 DELETE
  • MySql:查找特定记录的行号

    我正在使用一个通用数据面板 该面板可以向该面板提供各种不同的查询 它们可能是从表或视图中选择的简单查询 也可能是用户使用复杂的联接和其他表达式自行定义的复杂查询 我正在尝试修改我的数据面板 以便如果用户选择一条记录 然后对表进行排序 我会找
  • 为什么结合性是运算符的基本属性,而不是优先级的基本属性

    在任何编程语言教科书中 我们总是被告知该语言中的每个运算符如何具有左结合性或右结合性 结合性似乎是任何运算符的基本属性 无论其需要多少操作数 在我看来 我们可以将任何关联性分配给任何运算符 无论我们如何将关联性分配给其他运算符 但为什么会这