您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++如何避免復雜的表達式”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++如何避免復雜的表達式”吧!
ES.40:避免復雜的表達式
Complicated expressions are error-prone.
復雜的表達式容易引發錯誤。
// 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">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;
上述代碼中的有些表達式無論在什么情況下都是不好的(例如,它們依賴未定義的行為)。其他只是過于復雜,并且/或者不常見,從而使優秀的程序員也會錯誤理解或者匆忙中漏掉問題。
C++收緊了運算次序規則(除了賦值時從右到左之外都是從左到右,同時函數參數的運算次序是未定義的,參見ES.43),但是這也不會改變復雜的表達式可能引起混亂的事實。
A programmer should know and use the basic rules for expressions.
程序員應該理解并運用關于表達式的基本準則。
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(實施建議)
難辦。一個表達式到底復雜到什么程度算復雜?每個語句中只包含一個操作也會導致難以理解。需要考慮一下因素:
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++如何避免復雜的表達式這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。