当前位置: 首页 > news >正文

运算符优先级有没有通用原则?

运算符优先级有没有通用原则?

通用原则

  • 单目运算符和操作数结合强,优先于双目运算符,双目运算符优先于三目运算符。

  • 算术运算符经常使用,优先于关系运算符,关系运算符优先于逻辑运算符。

  • 移位运算符依然属于数值运算,优先级偏高,高于关系和逻辑运算符。

  • 大部分编程语言的运算符都是从左至右结合的,但是也有一些是从右至左结合的。例如,单目运算符(前缀后缀需要区分开)、三目运算符和赋值运算符是从右至左结合的。

  • 大体规则:初级运算符( )、[ ]、->、. > 单目运算符(包含逻辑非!) > 算术运算符(先乘除后加减) > 关系运算符 > 逻辑运算符(不包括!, && > ||) > 条件运算符 > 赋值运算符 > 逗号运算符。

  • C++支持运算符重载,运算符优先级不受运算符重载影响。

C语言标准的优先级

  • C标准6.5章节介绍了不同类型表达式的优先级:n1570.pdf (open-std.org).
    例如:如下移位表达式没有累加表达式优先级更高。
    shift-expression:
    additive-expression
    shift-expression << additive-expression
    shift-expression >> additive-expression
    从如上的表达式描述语义可以看到对优先级的定义。

C++优先级

  • C++相比C语言,扩展了新的运算符,其它已有的运算符和C语言优先级一致。

  • 范围解析::被列为第一优先级,类型名称typeid和类型转换const_cast/dynamic_cast/reintepret_cast/static_cast和C语言postfix-expression优先级为一组。

  • new/delete运算符和unary-expression优先级为一组。

  • 指向成员的指针.*和->*紧随上面unary-expression之后,在所有multiplicative-expression表达式之上。

  • throw只比逗号运算符优先级高。
    参考: C++ 内置运算符、优先级和关联性

其它语言优先级

  • ObjC和C语言优先级完全一样。

  • Java没有显式指针,运算符优先级和C语言一样,增加了instanceof操作符,表达式返回bool类型,预设优先级和比较关系运算符一样,高于判等运算符==和!=.

  • C#运算符优先级和C语言一样,有增加一些关键字作为运算符。更多参考: C# 运算符和表达式

  • Python相比C语言,增加了求幂运算符**, 优先级略高于unary operator. 另外,移除了&&、||和!逻辑运算符,改用and/or/not/is/in自然语言,它们的优先级等同。lambda表达式优先级最低。

  • JavaScript运算符除了和C语言一样的之外,增加了全等===和不全等!==, 优先级和判等运算符一组。还增加了一元操作符delete new typeof void, 和C/C++一元运算符优先级类似,与++/--/-/~等运算符优先级为一组。

  • Go语言和C语言运算符优先级保持一致,运算符更少,移除了前缀自增自减++/--, 只有后缀自增自减,优先级在第一梯队。

前缀和后缀自增自减运算符

  • 也许你会在不同的书籍上看到对此有不同的描述,以自增为例,有的说后缀自增更低,有的说更高。

  • 事实上,它们是分别从语言标准定义和最终运行结果来看,产生的不同说法。

  • 以C标准primary expression角度,x++和x[1]数组访问都属于"主要"表达式,primary expression优先级比较高,会给人后缀++优先级很高的样子,其实语言并没有把++真放的很高,只是为了表达x++仅仅返回了x, 后缀++其实是副作用,不是语言认为的"主要意图"。从实际运行的角度,似乎后缀++优先级就很低了,因为它只是附带的。


若文章对您有帮助,欢迎关注。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。


http://www.mrgr.cn/news/54429.html

相关文章:

  • 科研进展 | RSE:全波形高光谱激光雷达数据Rclonte系列处理算法一
  • Rust小练习,编写井字棋
  • 端到端测试?何必Postman,试试Automan
  • 使用RabbitMQ实现延迟消息的完整指南
  • 深度解析模型调优与正则化:L1、L2正则化及偏差-方差的权衡
  • Nginx(六)
  • 点餐小程序实战教程20广告管理
  • PCL点云库 概览
  • 大数据hive(二)
  • 批量归一化Batch Norm
  • 【PyTorch 】【CUDA】深入了解 PyTorch 中的 CUDA 和 cuDNN 版本及 GPU 信息
  • 在MySQL中建索引时需要注意哪些事项?
  • vue查缺补漏
  • 不同jdk版本中的接口规范
  • Python生成随机密码脚本
  • curl,nc和telnet的用法以及其他常用工具(nc代理与重定向)
  • 用 CSS 和 JS 打造简约又不失亮点的客户评价展示
  • 【Python】基础语法
  • 【Linux】main函数的参数列表从何而来?
  • 基于SpringBoot基于微信的借书驿站小程序【附源码】
  • 嘉立创EDA个人学习笔记2(绘制51单片机核心板)
  • EDA系统的性能
  • ChatGLM-6B中英双语对话大模型Windows本地部署实战
  • Vulhub Basic Pentesting: 2 Target Machines
  • 如何高效练习键盘盲打?这些在线网站帮你提高打字速度
  • Node.js 版本管理工具 n