對程式碼風格的探索(持續更新)
阿新 • • 發佈:2020-10-26
目錄
前言
這篇博文主要記錄一下我對自己程式碼風格的改善。
程式碼風格的改善一般還是為了休閒, 但有時其帶來的收益確實是巨大的,
我個人認為絕大多數情況下收益體現在常數、編碼難度和程式碼閱讀舒適度上。
基本 style
if-else語句和三目運算子
基本
參考 這篇文章, 兩者的效率似乎沒有差別;參考 這篇文章, 得知上篇文章似乎預設編譯器開啟了優化。
對於 if-else, 似乎有個叫做分支預測的東西使得這個語句要有上界為 14 的時鐘週期, 而三目運算子只有 4。(這一句話是憑著模糊的記憶寫出來的, 大可不看)
即使 if-else 和三目運算子有著幾乎相同的效率, 我還是喜歡使用三目運算子。
要注意的是三目運算子似乎不能返回 void
型別, 所以在裡面塞函式的時候要注意最後要加個 0。
例如:這段程式碼可以正常執行, 輸出結果是 4
#include<bits/stdc++.h> using namespace std; void fuc1(int &x) {x += 1;} void fuc2(int &x) {x += 2;} int main() { int a = 1; // if(a==1) fuc1(a), fuc2(a); a==1 ? fuc1(a),fuc2(a),0 :0; cout << a; return 0; }
實際上, 三目運算子可以在一定程度上代替 if-else 語句的本質是逗號表示式的性質, 參考自 這篇文章。
三目運算子不能代替如下 if語句:
if(x) return;
if(X) continue;
if(P) break;
其它的我就不知道了。
一點小 trick
短語句前置
這個 trick 的意思是, 這樣的一個分支:
if(x) {
o o o o
o o o o
} else o o;
要改成三目運算子的話, !x ? o o : o o o o o o o o;
有時會比 x ? o o o o o o o o : x
寫起來好看, 特別是分支有巢狀的時候。
比如:
int Merge(int a, int b)
{
return
a&&b
?
mx(a)<mx(b)?a^=b^=a^=b:0,
rc(a) = Merge(rc(a),b),
npl(lc(a))<npl(rc(a))
?
lc(a)^=rc(a)^=lc(a)^=rc(a)
:0,
npl(a) = npl(rc(a))+1,
a
:a|b;
}
int Merge(int a, int b) {
return !a||!b ? a|b :
mx(a)<mx(b)?a^=b^=a^=b:0,
rc(a) = Merge(rc(a),b),
npl(lc(a))<npl(rc(a)) ? lc(a)^=rc(a)^=lc(a)^=rc(a):0,
npl(a) = npl(rc(a))+1,
a
}
當然, 實際上沒啥卵用。