1. 程式人生 > 實用技巧 >對程式碼風格的探索(持續更新)

對程式碼風格的探索(持續更新)

目錄


前言

學習了下這個人的風格

這篇博文主要記錄一下我對自己程式碼風格的改善。

程式碼風格的改善一般還是為了休閒, 但有時其帶來的收益確實是巨大的,

我個人認為絕大多數情況下收益體現在常數、編碼難度和程式碼閱讀舒適度上。


基本 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
}

當然, 實際上沒啥卵用。