3. 语法"陷阱"
1. C运算符优先级
| 运算符(优先级从高到低) | 结合律 |
| ++(后置)、--(后置)、()(函数调用)、[]、{}、(复合字面量)、. 、-> | 从左往右 |
| ++(前置)、--(前置)、-、+、~、!、*(解引用)、&(取址)、sizeof、_Alignof(类型名)(本栏都是一元运算符) | 从右往左 |
| (类型名) | 从右往左 |
| *、/、% | 从左往右 |
| +、-(都是二元运算符) | 从左往右 |
| <<、>> | 从左往右 |
| <、>、<=、>= | 从左往右 |
| ==、!= | 从左往右 |
| & | 从左往右 |
| ^ | 从左往右 |
| | | 从左往右 |
| && | 从左往右 |
| || | 从左往右 |
| ?:(条件表达式) | 从右往左 |
| =、*=、/=、+=、-=、<<=、>>=、&=、|=、^= | 从右往左 |
| ,(逗号运算符) | 从左往右 |
注:以上优先级来自C Primer Plus第六版中文版
采用C缺陷与陷阱总结为:
- 非运算符和一元运算符
- 算数运算符
- 移位运算符
- 关系运算符
- 逻辑运算符
- 条件表达式
- 赋值运算符
- 逗号运算符
2. C++运算符优先级
| 等级 | 结合律 | 运算符 | 功能 | 用法 |
| 1 | 左 | :: | 全局作用域 | ::name |
| 左 | :: | 类作用域 | class::name | |
| 左 | :: | 命名空间作用域 | namespace::name | |
| 2 | 左 | . | 成员选择 | object.member |
| 左 | -> | 成员选择 | ptr->member | |
| 左 | [] | 下标 | expr[expr] | |
| 左 | () | 函数调用 | name(expr_list) | |
| 左 | () | 类型构造 | type(expr_list) | |
| 3 | 右 | ++ | 后置递增运算 | lvalue++ |
| 右 | -- | 后置递减运算 | lvalue-- | |
| 右 | typeid | 类型ID | typeid(type) | |
| 右 | typeid | 运行时类型ID | typeid(expr) | |
| 右 | explicit_cast | 类型转换 | cast_name<type>(expr) | |
| 4 | 右 | ++ | 前值递增运算 | ++lvalue |
| 右 | -- | 前置递减运算 | --lvalue | |
| 右 | ~ | 位求反 | ~expr | |
| 右 | ! | 逻辑非 | !expr | |
| 右 | - | 一元负号 | -expr | |
| 右 | + | 一元正号 | +expr | |
| 右 | * | 解引用 | *expr | |
| 右 | & | 取地址 | &lvalue | |
| 右 | () | 类型转换 | (type)expr | |
| 右 | sizeof | 对象的大小 | sizeof expr | |
| 右 | sizeof | 类型的大小 | sizeof(type) | |
| 右 | sizeof... | 参数包的大小 | sizeof...(name) | |
| 右 | new | 创建对象 | new type | |
| 右 | new[] | 创建数组 | new type[size] | |
| 右 | delete | 释放对象 | delete expr | |
| 右 | delete[] | 释放数组 | delete[] expr | |
| 右 | noexcept | 能否抛出异常 | noexpect(expr) | |
| 5 | 左 | ->* | 指向成员选择的指针 | ptr->*ptr_to_member |
| 左 | .* | 指向成员选择的指针 | obj.*ptr_to_member | |
| 6 | 左 | * | 乘法 | expr * expr |
| 左 | / | 除法 | expr / expr | |
| 左 | % | 取模(取余) | expr % expr | |
| 7 | 左 | + | 加法 | expr + expr |
| 左 | - | 减法 | expr - expr | |
| 8 | 左 | << | 向左移位 | expr << expr |
| 左 | >> | 向右移位 | expr >> expr | |
| 9 |
左 | < | 小于 | expr < expr |
| 左 | <= | 小于等于 | expr <= expr | |
| 左 | > | 大于 | expr > expr | |
| 左 | >= | 大于等于 | expr >= expr | |
| 10 | 左 | == | 等于 | expr == expr |
| 左 | != | 不等于 | expr != expr | |
| 11 | 左 | & | 位与 | expr & expr |
| 12 | 左 | ^ | 位异或 | expr ^ expr |
| 13 | 左 | | | 位或 | expr | expr |
| 14 | 左 | && | 逻辑与 | expr && expr |
| 15 | 左 | || | 逻辑或 | expr || expr |
| 16 | 右 | ?: | 条件 | expr ? epxr : expr |
| 17 | 右 | = | 赋值 | lvaue = epxr |
| 18 | 右 | *=、/=、%= | 复合赋值 | lvalue += expr 等 |
| 右 | +=、-= | |||
| 右 | <<=、>>= | |||
| 右 | &=、|=、^= | |||
| 19 | 右 | throw | 抛出异常 | throw expr |
| 20 | 左 | , | 逗号 | expr, expr |
注:以上优先级来自C++ Primer 第五版中文版
大致运算符优先级同上
3. 语法"陷阱"的更多相关文章
- JavaScript 语法陷阱
没有一门编程语言是完美的,JavaScript 也不例外,它语法陷阱重重,防不胜防: 加号 "with" 分号自动插入 声明提升 "eval" 多行字符串 变量 ...
- [C陷阱和缺陷] 第2章 语法“陷阱”
第2章 语法陷阱 2.1 理解函数声明 当计算机启动时,硬件将调用首地址为0位置的子例程,为了模拟开机时的情形,必须设计出一个C语言,以显示调用该子例程,经过一段时间的思考,得出语句如下: ( * ...
- C陷阱与缺陷代码分析之第2章语法陷阱
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 陷阱1 理解函数声明 作者提出一个问题:有一个首地址为0的函数,该函数返回值类型为void,没有参数.怎样用C语言的 ...
- c缺陷与陷阱笔记-第二章 语法陷阱
1.函数的调用和番薯返回值是函数指针的声明 定义一个函数指针,例如 int (*fp)(float),这个函数的返回值是Int,参数是1个float类型,调用这个函数的方法是 (*fp)(),还有f ...
- C陷阱与缺陷之语法陷阱
2.1理解函数声明 不论什么C变量的声明都由两部分组成:类型以及一组类似表达式的声明符号.比如 float f; 这个声明的含义是:当对其求值时,表达式f和g的类型为浮点数类.由于声 明符与表达式的相 ...
- 《C陷阱与缺陷》读书笔记
1. 词法“陷阱” = 不同于 == , 可以通过if( 1 == a )来避免 & | 不同于 && || 词法分析中的“贪心法” 编译器将程序分解成符号的方法是,从左到右一 ...
- C的陷阱和缺陷研读笔记01
词法分析: 编译器将程序分解成符号的方法是 从左到右一个一个字符的读入,如果该字符可能组成一个符号,再读入下一个字符 而c语言里的符号 / * =只有一个字符长, 是单字符的, /* == 一些事双字 ...
- C陷阱与缺陷(二)
第二章 语法陷阱 2.1 理解函数声明 (*(void(*)())0)();任何C变量的声明都由两部分组成:类型以及一组类似表达式的声明符.一旦我们知道了如何声明一个给定类型的变量,那么该类型的类型转 ...
- 【转】C缺陷和陷阱学习笔记
http://www.cnblogs.com/hbiner/p/3591335.html?utm_source=tuicool&utm_medium=referral 这段时间把<C陷阱 ...
随机推荐
- 探索Dynamics 365 用户能够登录使用的最小权限需求
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- Nginx代理前端代码
Nginx 安装配置 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/ ...
- diango创建一个app
创建一个app terminal里执行命令 python manage.py startapp app名称 注册 settings配置 INSTALLED_APPS = [ 'app01', 'app ...
- Linux系统学习 二十、SAMBA服务—介绍、安装、端口
1.简介 网络数据文件共享服务器 可以和Windows中的网上邻居通用 数据共享的方法: Windows中最常用的是“网上邻居”.网上邻居使用的文件系统是CIFS(通用互联网文件系统)协议进行数据共享 ...
- 如何在Mac上使用Netstat命令
macOS上的netstat命令是一个终端命令,用于显示有关Mac网络通信的详细信息.网络通信包括Mac通过所有端口和所有应用程序与外界进行交流的所有方式.掌握netstat可以帮助您了解计算机之间的 ...
- VUE中 $on, $emit, v-on三者关系
VUE中 $on, $emit, v-on三者关系 每个vue实例都实现了事件借口 使用$on(eventName)监听事件 使用$emit(eventName)触发事件 若把vue看成家庭(相当于一 ...
- LeetCode 771: 宝石与石头 Jewels and Stones
题目: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. You're given strings ...
- 【Unity游戏开发】性能优化之在真机上开启DeepProfile与踩坑
一.引子 最近马三入职了新公司,平时除了负责编辑器开发之外还要做一些游戏性能优化方面的工作.在这里首先给大家安利一下Unity官方的性能测试分析工具URP ,这个工具目前是免费,测试的过程中也不需要接 ...
- 损失函数--KL散度与交叉熵
损失函数 在逻辑回归建立过程中,我们需要一个关于模型参数的可导函数,并且它能够以某种方式衡量模型的效果.这种函数称为损失函数(loss function). 损失函数越小,则模型的预测效果越优.所以我 ...
- django js 实现表格动态标序号
<table class="table table-striped"> <thead> <tr class="key_words_head& ...