首页 >后端开发 >C++ >关于编程语言中的表达式求值,运算符优先级和结合性表实际上告诉我们什么?

关于编程语言中的表达式求值,运算符优先级和结合性表实际上告诉我们什么?

DDD
DDD原创
2024-11-01 12:32:02778浏览

What do operator precedence and associativity tables actually tell us about expression evaluation in programming languages?

运算符优先级和结合性:定义以及与计算顺序的关系

简介

编程中语言、运算符优先级和结合性决定了运算符的求值顺序。虽然许多编程教科书提供了列出这些属性的表格,但关于它们的解释及其定义的来源却出现了问题。

问题

  1. 如果函数的概念是总是从左到右评估是不正确的,运算符优先级和结合性表真正表示什么?
  2. 如果不是 ANSI 标准,谁建立运算符优先级和结合性?如果 ANSI 确实定义了它,为什么标准中很少明确提及?此信息是从 ANSI C 标准推断出来的还是在其他地方建立的?

答案

运算符优先级和关联性定义

运算符优先级和结合性是在语言标准本身中定义的。标准语法指定了构造表达式的规则。通过检查这些规则,可以推导出运算符的优先级和结合性。

例如,在 C 中,加法表达式(加法和减法)的语法如下:

additive-expression:
  multiplicative-expression
  additive-expression + multiplicative-expression
  additive-expression - multiplicative-expression

从这条规则,我们可以推断出乘法表达式(乘法和除法)比加法表达式具有更高的优先级,因为它们是加法表达式的子规则。此外,可以从规则中推断出 and - 运算符的从左到右的关联性,该规则规定一个加法表达式可以递归地由其他加法表达式组成。

求值顺序

区分运算符优先级和结合性以及求值顺序至关重要。虽然优先级和结合性决定了运算符的分组方式,但计算顺序是指计算各个表达式的顺序。在 C 中,不能保证严格按照优先级和结合性进行求值。

例如,在表达式 f1() f2() * f3() 中, * 运算符的优先级高于运算符,因此在分组 f1() (f2() * f3()) 中。但是,计算顺序未定义,这意味着可以首先计算 f3()、f1() 或 f2()。

某些运算符,例如逻辑 OR (||) 运算符,可以执行对它们的操作数求值施加一个序列,允许短路。在x||中y, x 总是在 y 之前评估,以确定是否需要评估 y。

以上是关于编程语言中的表达式求值,运算符优先级和结合性表实际上告诉我们什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn