这篇文章主要讲解了“C++如何避免复杂的表达式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++如何避免复杂的表达式”吧!
ES.40:避免复杂的表达式
Complicated expressions are error-prone.
复杂的表达式容易引发错误。
// bad: assignment hidden in subexpressionwhile ((c = getc()) != -1)// bad: two non-local variables assigned in sub-expressionswhile ((cin >> c1, cin >> c2), c1 == c2)// better, but possibly still too complicatedfor (char c1, c2; cin >> c1 >> c2 && c1 == c2;)// OK: if i and j are not aliasedint x = ++i + ++j;// OK: if i != j and i != kv[i] = v[j] + v[k];// bad: multiple assignments "hidden">x = a + (b = f()) + (c = g()) * 7;// bad: relies on commonly misunderstood precedence rulesx = a & b + c * d && e ^ f == 7;// bad: undefined behaviorx = x++ + x++ + ++x;
上述代码中的有些表达式无论在什么情况下都是不好的(例如,它们依赖未定义的行为)。其他只是过于复杂,并且/或者不常见,从而使优秀的程序员也会错误理解或者匆忙中漏掉问题。
C++收紧了运算次序规则(除了赋值时从右到左之外都是从左到右,同时函数参数的运算次序是未定义的,参见ES.43),但是这也不会改变复杂的表达式可能引起混乱的事实。
A programmer should know and use the basic rules for expressions.
程序员应该理解并运用关于表达式的基本准则。
x = k * y + z; // OKauto t1 = k * y; // bad: unnecessarily verbosex = t1 + z;if (0 <= x && x < max) // OKauto t1 = 0 <= x; // bad: unnecessarily verboseauto t2 = x < max;if (t1 && t2) // ...
Enforcement(实施建议)
难办。一个表达式到底复杂到什么程度算复杂?每个语句中只包含一个操作也会导致难以理解。需要考虑一下因素:
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?
又实现决定的行为。
感谢各位的阅读,以上就是“C++如何避免复杂的表达式”的内容了,经过本文的学习后,相信大家对C++如何避免复杂的表达式这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4579737/blog/4354461