《C++覆辙录》——2.5:取大优先解析原则带来的问题

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

本节书摘来自异步社区出版社《C++覆辙录》一书中的第2章,第2.5节,作者: 【美】Stephen C. Dewhurst(史蒂芬 C. 杜赫斯特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.5:取大优先解析原则带来的问题

当面对如下表达式时,你何以措手足?

++++p->*mp;```
你可曾有幸和“中士运算符”17打过交道?

template
class R{
  // ...
  friend ostream &operator <<< // 一个“中士运算符”?
    T>(ostream &, const R&);
};`
你可曾为“下面的表达式是否合法”的问题迟疑过?

a+++++b
欢迎进入取大优先解析原则的世界!在C++源代码被编译的早期阶段,编译器中负责“词法分析”的部分有一项任务,就是把源码输入流打碎成一个个地“单词”,或曰“词法单位”。当词法分析过程遇到一个形如“->”的字符序列时,它可以同样合理地把它解释成3个词法单位(“-”、“>”和“”)、2个词法单位(“->”和“*”)或是单个1个的词法单位(“->*”)`。为了摆脱此类多义性的局面,词法分析引入了取大优先解析原则,也就是总是能取多长的可以作为词法单位的字符序列就取多长:取大优先嘛。

表达式“a+++++b”是非法的,因为它被解析成了“a++ ++ +b”,但对像“a++”这样的右值应用后置自增运算符是非法的。如果你想把一个后置自增的a和一个前置自增b的相加,你至少要加一个空格:“a+++ ++b”。如果你哪怕考虑到了你的维护工程师一点点,你就会再加一个空格,尽管严格说来不是必要的:“a++ + ++b”。多加几个括号的话,也实在不会有谁抱怨你什么:“(a++) + (++b)”。

取大优先解析原则除了在两种常见情况下,多数都是作为问题解决者而不是制造者的形象出现。不过在这两种情况下,的确令人生厌。第一种情况是用一个模板具现化的结果型别来具现化另一个模板。举例来说,采用标准库里的元素的话,某软件工程师打算声明一个list,其元素是以string对象为元素的vector容器:

list<vector<string>> lovos; // 错误!  ```
倒霉的是,在具现语法里两个相毗邻的右半个尖括号被解释成了一个右移位运算符,于是我们就犯了一个语法错误。空格在这种情况下是非加不可的:
`
list<vector<string> > lovos;`
另一种情况是为指针型别的形参给予默认初始化值的时候:
`
void process(const char*=0); // 错误! ` 
这个声明企图在形参列表里使用运算符*=。语法错误。这种错误属于“自作孽,不可活”——如果代码作者记得给形参一个名字,就根本不会犯这种错误。现在你明白了,给予形参名字不仅起了“自注释”的作用,同时也让取大优先解析原则带来的问题消弭于未现:

void process(const char *processId = 0);`

相关文章
|
1月前
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
45 2
|
8天前
|
自然语言处理 编译器 Linux
|
3天前
|
算法 Python
Python 大神修炼手册:图的深度优先&广度优先遍历,深入骨髓的解析
在 Python 编程中,掌握图的深度优先遍历(DFS)和广度优先遍历(BFS)是进阶的关键。这两种算法不仅理论重要,还能解决实际问题。本文介绍了图的基本概念、邻接表表示方法,并给出了 DFS 和 BFS 的 Python 实现代码示例,帮助读者深入理解并应用这些算法。
12 2
|
14天前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
24天前
|
架构师 关系型数据库 MySQL
MySQL最左前缀优化原则:深入解析与实战应用
【10月更文挑战第12天】在数据库架构设计与优化中,索引的使用是提升查询性能的关键手段之一。其中,MySQL的最左前缀优化原则(Leftmost Prefix Principle)是复合索引(Composite Index)应用中的核心策略。作为资深架构师,深入理解并掌握这一原则,对于平衡数据库性能与维护成本至关重要。本文将详细解读最左前缀优化原则的功能特点、业务场景、优缺点、底层原理,并通过Java示例展示其实现方式。
55 1
|
1月前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
33 4
|
1月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
52 2
|
1月前
|
存储 设计模式 编译器
【C++篇】C++类与对象深度解析(五):友元机制、内部类与匿名对象的高级应用
【C++篇】C++类与对象深度解析(五):友元机制、内部类与匿名对象的高级应用
24 2
|
29天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
64 0
|
29天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
51 0

推荐镜像

更多
下一篇
无影云桌面