<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            C語言

            C語言中根據成員變量來排序的兩種方法

            時間:2025-06-01 18:58:40 C語言 我要投稿
            • 相關推薦

            C語言中根據成員變量來排序的兩種方法

              C語言中根據成員變量來排序有兩種方法,分別是什么方法呢,下面小編為你介紹一下吧!

              第一種,最常用的是創建一個中間變量來循環交換它們的值:

              T a = ...;T b = ...;.T tmp = a; a = b; a = tmp;

              我們稱這種策略p99_swap1。在這里,編譯器必須嚴格實現三個任務的順序,否則,由此程序產生的結果將是不正確的。

              第二種,叫它p99_swap2,試圖做類似的事情,但放松一些順序約束:

              T a = ...;T b = ...;.T tmpa = a; T tmpb = b;a = tmpb; b = tmpa;

              用更多的資源(棧空間或寄存器)可以產生更有效的代碼。兩個對象可以平行地加載和保存。但收益可能只在小對象上可以看到。所以將兩者結合起來是一個可能的嘗試

              #define P99_SWAP(A, B) (sizeof(A) > sizeof(uintmax_t) ? P99_SWAP1(A, B) : P99_SWAP2(A, B))

              但是如何實現兩個 “子宏” P99_SWAP1 和 P99_SWAP2(A, B) ?如果我們想使用C的宏或者函數來實現的難度在于僅僅是傳遞參數A和B而不知道其類型,所以讓我們先寫函數和宏,忘記類型問題:

              inlinevoid p00_swap2(void* a, void* b, void* tmpa, void* tmpb, size_t len) { memcpy(tmpa, a, len); memcpy(tmpb, b, len); memcpy(b, tmpa, len); memcpy(a, tmpb, len);}#define P00X_SWAP2(A, B) p00_swap2( &(A),           &(B),           (char[sizeof(A)]){ [0] = 0 },     (char[sizeof(A)]){ [0] = 0 }, sizeof(A))

              這個古怪的表達式: (char[sizeof(A)]){ [0] = 0 } 被稱為復合文字(C99新特性),為復制操作提供臨時對象。

              這有幾個缺點。首先,我們甚至沒有檢查是否A和B與對象具有相同的大小,但我們很愉快地復制到他們。因此,首先,我們必須斷言它們至少具有相同的大小,避免引起不確定的行為。這樣就可以為兩個復合文字實現一些表達上的魔法:

              (char[sizeof(A)]){ [(intmax_t)sizeof(A) - sizeof(B)] = 0 }

              其中:intmax_t類型指定一個最大尺寸有符號整數

              這里發生了什么?右邊的[]里面,一個指定的初始值,被用來初始化字符數組中的一個元素。現在我們將比較兩者的大小:如果兩者相等,則表示位置0處的元素,如果sizeof(A) < sizeof(B) ,類型轉換 intmax_t 在編譯的期間將產生一個負數。

              如果現在我們將上面的策略應用于第二個復合文字,我們得到一個宏,在它調用兩個相同大小的對象的時候成功編譯,并在大小不同的時候在編譯期間產生錯誤:

              #define P00_SWAP2(A, B)p00_swap2(               &(A),                &(B),                (char[sizeof(A)]){ [(intmax_t)sizeof(A) - sizeof(B)] = 0 },  (char[sizeof(B)]){ [(intmax_t)sizeof(B) - sizeof(A)] = 0 },  sizeof(A))

              這現在已經是更安全,但也許還不夠安全,因為這兩個對象可能有相同的大小,但仍然不是同一類型。我們可以做一個額外的檢查來確定這兩種類型是否是兼容的。這可以通過下面這樣的可能第一眼看起來有點hack

              (1 ? &(A) : ((A = B), NULL))#define P99_SWAP(A, B) (sizeof(A) > sizeof(uintmax_t) ? P99_SWAP1(A, B) : P99_SWAP2(A, B))

              這里的條件總是真,所以它總是等于&(A)。第二個“假”部分在運行時從未執行,但只用來檢查它是否是正確的C代碼。如果A和B不會兼容,則表示不是正確的C代碼。

              以上就是這篇文章的全部內容,希望本文的內容對大家的學習和工作能帶來幫助,如果有疑問可以留言交流。

            【C語言中根據成員變量來排序的兩種方法】相關文章:

            C語言中根據成員變量來排序的方法04-13

            c語言中什么是變量06-05

            C語言中的相關變量知識05-11

            C語言中變量儲存的類別07-24

            C++類的成員變量和成員函數06-01

            c語言中什么是靜態變量02-02

            C語言中判斷int、long型等變量是否賦值的方法06-10

            c語言中冒泡排序、插入排序、選擇排序算法比較07-11

            c語言中使用環境變量的技巧07-13

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院