溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++如何避免復(fù)雜的表達(dá)式

發(fā)布時(shí)間:2021-11-26 14:19:57 來(lái)源:億速云 閱讀:114 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“C++如何避免復(fù)雜的表達(dá)式”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C++如何避免復(fù)雜的表達(dá)式”吧!

ES.40:避免復(fù)雜的表達(dá)式

Reason(原因)

Complicated expressions are error-prone.

復(fù)雜的表達(dá)式容易引發(fā)錯(cuò)誤。

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">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;

上述代碼中的有些表達(dá)式無(wú)論在什么情況下都是不好的(例如,它們依賴未定義的行為)。其他只是過(guò)于復(fù)雜,并且/或者不常見,從而使優(yōu)秀的程序員也會(huì)錯(cuò)誤理解或者匆忙中漏掉問題。

Note(注意)

C++收緊了運(yùn)算次序規(guī)則(除了賦值時(shí)從右到左之外都是從左到右,同時(shí)函數(shù)參數(shù)的運(yùn)算次序是未定義的,參見ES.43),但是這也不會(huì)改變復(fù)雜的表達(dá)式可能引起混亂的事實(shí)。

Note(注意)

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

程序員應(yīng)該理解并運(yùn)用關(guān)于表達(dá)式的基本準(zhǔn)則。


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(實(shí)施建議)

難辦。一個(gè)表達(dá)式到底復(fù)雜到什么程度算復(fù)雜?每個(gè)語(yǔ)句中只包含一個(gè)操作也會(huì)導(dǎo)致難以理解。需要考慮一下因素:

  • 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

  • 副作用:可以懷疑多個(gè)非局部變量的副作用,特別是副作用存在于獨(dú)立的子表達(dá)式中的情況。

  • writes to aliased variables

  • 像變量的別名寫入。

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

  • 多余N個(gè)操作符(問題是N應(yīng)該是幾?)

  • reliance of subtle precedence rules

  • 結(jié)果依賴于不易察覺的優(yōu)先度規(guī)則。

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

  • 使用了未定義的行為(我們能找到未定義的行為么?)

  • implementation defined behavior?

  • 又實(shí)現(xiàn)決定的行為。

感謝各位的閱讀,以上就是“C++如何避免復(fù)雜的表達(dá)式”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)C++如何避免復(fù)雜的表達(dá)式這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI