C++核心准则ES.40:避免复杂的表达式

ES.40: Avoid complicated expressions

ES.40:避免复杂的表达式

 

Reason(原因)

 

Complicated expressions are error-prone.

复杂的表达式容易引发错误。

 

Example(示例)

// bad: assignment hidden in subexpression
while ((c = getc()) != -1)

// bad: two non-local variables assigned in sub-expressions
while ((cin >> c1, cin >> c2), c1 == c2)

// better, but possibly still too complicated
for (char c1, c2; cin >> c1 >> c2 && c1 == c2;)

// OK: if i and j are not aliased
int x = ++i + ++j;

// OK: if i != j and i != k
v[i] = v[j] + v[k];

// bad: multiple assignments "hidden" in subexpressions
x = a + (b = f()) + (c = g()) * 7;

// bad: relies on commonly misunderstood precedence rules
x = a & b + c * d && e ^ f == 7;

// bad: undefined behavior
x = x++ + x++ + ++x;

Some of these expressions are unconditionally bad (e.g., they rely on undefined behavior). Others are simply so complicated and/or unusual that even good programmers could misunderstand them or overlook a problem when in a hurry.

上述代码中的有些表达式无论在什么情况下都是不好的(例如,它们依赖未定义的行为)。其他只是过于复杂,并且/或者不常见,从而使优秀的程序员也会错误理解或者匆忙中漏掉问题。

 

Note(注意)

C++17 tightens up the rules for the order of evaluation (left-to-right except right-to-left in assignments, and the order of evaluation of function arguments is unspecified; see ES.43), but that doesn't change the fact that complicated expressions are potentially confusing.

C++收紧了运算次序规则(除了赋值时从右到左之外都是从左到右,同时函数参数的运算次序是未定义的,参见ES.43),但是这也不会改变复杂的表达式可能引起混乱的事实。

 

Note(注意)

A programmer should know and use the basic rules for expressions.

程序员应该理解并运用关于表达式的基本准则。


Example(示例)

x = k * y + z;             // OK

auto t1 = k * y;           // bad: unnecessarily verbose
x = t1 + z;

if (0 <= x && x < max)   // OK

auto t1 = 0 <= x;        // bad: unnecessarily verbose
auto t2 = x < max;
if (t1 && t2)            // ...

Enforcement(实施建议)

Tricky. How complicated must an expression be to be considered complicated? Writing computations as statements with one operation each is also confusing. Things to consider:

难办。一个表达式到底复杂到什么程度算复杂?每个语句中只包含一个操作也会导致难以理解。需要考虑一下因素:

  • side effects: side effects on multiple non-local variables (for some definition of non-local) can be suspect, especially if the side effects are in separate subexpressions

  • 副作用:可以怀疑多个非局部变量的副作用,特别是副作用存在于独立的子表达式中的情况。

  • writes to aliased variables

  • 像变量的别名写入。

  • more than N operators (and what should N be?)

  • 多余N个操作符(问题是N应该是几?)

  • reliance of subtle precedence rules

  • 结果依赖于不易察觉的优先度规则。

  • uses undefined behavior (can we catch all undefined behavior?)

  • 使用了未定义的行为(我们能找到未定义的行为么?)

  • implementation defined behavior?

  • 又实现决定的行为。

  • ???

     

 

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es40-avoid-complicated-expressions

 


 

觉得本文有帮助?欢迎点赞并分享给更多的人。

阅读更多更新文章,请关注微信公众号【面向对象思考】

热门文章

暂无图片
编程学习 ·

操作系统——银行家算法

银行家算法安全性检测C++实现,求安全序列 #include <bits/stdc++.h>using namespace std; const int N = 100;const int total_resources = 3; //资源总数struct process {/* data */int resources_max[total_resources]; //每种资源的总大需求量int resources_a…
暂无图片
编程学习 ·

ps如何实现阳光照射效果

1.ps打开图片。2.按ctrl+j复制背景图层就会自动创建图层(图层 0 副本),选择图层 0 副本,按ctrl+alt+2调出高光选区,再按ctrl+j复制高光选区就会自动创建图层(图层 1)。3.选择图层1,ctrl+L打开色阶工具,拖动输入色阶的右边白色滑块向左边移动把图中亮的的地方调更亮。4…
暂无图片
编程学习 ·

云管理服务AWS Organizations正式在AWS中国区域上线

近期, AWS中国(宁夏)区域(由西云数据运营)和AWS中国(北京)区域(由光环新网运营)正式上线了云管理服务AWS Organizations。作为一种管理服务,AWS Organizations可集中控制和管理多个AWS账户,无论是初创公司还是大型企业均可以使用,而不需要额外付费。随着企业或机构…
暂无图片
编程学习 ·

plotnine可视化绘图(二)---geom

一些示例数据1. 点图from plotnine import ggplot, geom_point, aes, stat_smooth, facet_wrap from plotnine.data import mtcarsp=(ggplot(mtcars, aes(wt, mpg, color=factor(gear)))+ geom_point()+ stat_smooth(method=lm)+ facet_wrap(~gear))p.save(filename=png_path,w…
暂无图片
编程学习 ·

Linux下redis的安装及用法

Linux下redis的安装及用法 下面介绍在Linux环境下,Redis的安装与部署 1、在安装redis之前先安装C++编译环境,查看目前服务器上gcc的版本:gcc -v, 如果Linux系统没有安装gcc编译器,会提示“Command not found”;如果提示命令找不到,则表明没有安装; 或者更新版本,不然后…
暂无图片
编程学习 ·

C语言复习笔记

C语言复习笔记 仅记录复习过程中的混淆和记忆模糊的知识点。 1、常量-八进制整数 在C语言中,如果一个整数是以 0 开头的,那么这个数是以八进制来表示的,即八进制整数。0x为十六进制整数。 2、 一个整数,例如1500,为 int 类型(21亿),如果是 1500L,则表示长整型,1500U …
暂无图片
编程学习 ·

extern随笔

extern的用法总结函数声明是可有可无的,因为函数不加修饰符默认是extern的; 全局变量在其他文件中使用时,extern关键词是必须的,如果变量在其他文件中没有extern且没有显示的初始化,则会被当成变量的定义。局部变量是不需要extern关键字描述的,而且局部变量在程序运行时才…
暂无图片
编程学习 ·

斐波那契数列递归算法的优化

public class Fibonacci { //优化使用的数组 static long[] cach = new long[51];public static void main(String[] args) {long a = System.currentTimeMillis();System.out.println( fd( 50 ) );long l = System.currentTimeMillis();System.out.println( l - a );long l1 =…
暂无图片
编程学习 ·

数独小游戏开发(1)---自定义界面

放假闲着没事,自己写个小游戏练练手平时看到的数独小游戏的界面都是直接一个999\times999的小方格,这里使用自定义View实现。 重写onDraw()实现自定义界面的显示@Overridepublic void onDraw(Canvas canvas) { // super.onDraw(canvas);//浅色线条Paint grayPaint = n…
暂无图片
编程学习 ·

Object类的方法

Object 类是类层次结构的根,在 Java 语言中,所有的类从根本上而言都继承自这个类。而且,Object 类是 Java 语言中唯一没有父类的类,而其他所有的类,包括标准容器类,例如数组,都继承了 Object 类。方法名 返回类型 方法描述clone() Object 创建并返回此对象的一个副本equ…
暂无图片
编程学习 ·

Java数据结构--顺序栈

一、简介 1.1 概念栈:又称为堆栈,是限制在表的一端进行插入和删除的线性表。其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行插入、查找、删除等操作。 表中进行插入、删除操作的一端称为栈顶、栈顶保存的元素称为栈顶元素。相对的,表的另一端称为栈底…
暂无图片
编程学习 ·

07:从一个二维数组中查找一个数

题目:从一个二维数组中查找一个数 数组要求:从左到右,从上到小依次递增的矩形二维数组 思路:我们从矩阵的右上角开始查找,若该位置的数值小于目标值,列数减一;若数值大于目标值,行数加一,后续重复。 public class Offer07 {public static void main(String[] args) {i…
暂无图片
编程学习 ·

ROS学习笔记(十七):rviz之用户指导

1.Troubleshooting 如果您遇到问题并且没有看到下面的答案,请尝试“故障排除”页面 2.Install or build rviz 2.1 Install from debian repository Until fuerte: sudo apt-get install ros-fuerte-visualizationFrom groovy on: sudo apt-get install ros-groovy-rviz # or s…
暂无图片
编程学习 ·

spark | 手把手教你用spark进行数据预处理

本文始发于个人公众号:TechFlow,原创不易,求个关注今天是spark专题的第七篇文章,我们一起看看spark的数据分析和处理。过滤去重在机器学习和数据分析当中,对于数据的了解和熟悉都是最基础的。所谓巧妇难为无米之炊,如果说把用数据构建一个模型或者是支撑一个复杂的上层业…
暂无图片
编程学习 ·

助力5G基站建设的多功能智慧灯杆,启扬智能硬件解决方案

2020年分布密集的5G新基站成为建设重点,但是由于城市空间有限,充分利用路灯、电线杆、交通信号灯、广告牌等基础设施实现5G基站建设成为各城市的一致选择。其实早在2019年,利用路灯建设5G基站已写入多地政府政策中。工信部:集约利用现有基站站址和路灯杆、监控杆等公用设施,…
暂无图片
编程学习 ·

负载测试和压力测试

压力测试 压力测试是在强负载(大数据量、大量并发用户等)下的测试,查看系统在峰值使用情况下的操作行为,从而有效地发现系统的某项功能隐患、系统是否具有良好的容错能力和可恢复能力。压力测试分为高负载下的长时间稳定性压力测试和极限负载下导致系统崩溃的破坏性压力测试…