C qsortのこのコードの意味は何ですか?

mathcom
void qsort (void *a, size_t n, size_t es, int (*compare)(const void *, const void *)

ここで、aは配列アドレスの開始、nは配列のサイズ、esは配列要素のサイズです。

理解できないCのqsortのソースコードを読みました。コードは次のとおりです。

#define SWAPINT(a,es) swaptype = ((char*)a- (char*)0 % sizeof(long) || \
        es % sizeof(long) ? 2: es == sizeof(long)? 0 : 1

私はこのマクロを次のように解釈します。

if(((char*)a- (char*)0)% sizeof(long))==1 || es % sizeof(long)==1)
     swaptype = 2;
else if(es== sizeof(long))
     swaptype = 0;
else
     swaptype = 1;

しかし、なぜ型変換が実装されているのかわかりません(char *)a。

そして、この線の意味は何ですか?

(char*)a- (char*)0)% sizeof(long)==1
user824425

そのコードを見つけたところはどこでも、おそらくそれを間違ってコピーしたでしょう。libutilCanuから非常によく似たコードを見つけました

c.swaptype = ((char *)a - (char *)0) % sizeof(long) || \
  es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;

このコードは、FreeBSDのlibcからコピーされた可能性があります(著作権ライセンスの条件に違反しているため)。

//__FBSDID("$FreeBSD: src/lib/libc/stdlib/qsort.c,v 1.12 2002/09/10 02:04:49 wollman Exp $");

ですから、* BSDlibcの実装から得たと思います。実際、FreeBSDのクイックソート実装にSWAPINITマクロが含まれています(ではありませんSWAPINT)。

#define SWAPINIT(TYPE, a, es) swaptype_ ## TYPE =       \
        ((char *)a - (char *)0) % sizeof(TYPE) ||       \
        es % sizeof(TYPE) ? 2 : es == sizeof(TYPE) ? 0 : 1;

解析後、上記のコードはほぼ同じであることがわかります。

condition_one   = ((char *)a - (char *)0) % sizeof(long);
condition_two   = es %  sizeof(long);
condition_three = es == sizeof(long);
c.swaptype = (condition_one || condition_two) ? 2 : condition_three ? 0 : 1;

なおcondition_two条件として、ではないと同じes % sizeof(long) == 1ではなくes % sizeof(long) != 0それを除けば、あなたの翻訳は正しかった。


これらの条件の意図は次のように思われます。

  • condition_one整列されていないtrue場合aですlong
  • condition_twoあるtrueときesの倍数ではありませんlong
  • condition_threeあるtrueときes、正確ですlong

結果として、

  • swaptype == 2 交換について賢くするための要素についての十分な保証がない場合です。
  • swaptype == 1long境界に沿って整列された要素を持つ配列を対象としています(注:ただし、必ずしもlongとして整列されている必要はありません!)。
  • swaptype == 0前の説明に一致し、longサイズ同じ要素を持つ配列を対象としています

ので、この場合には、明示的な型変換は、あるaタイプ有するvoid*型演算が定義されていたためにただし、これも((char *)a - (char *)0)未定義であることに注意してください

2つのポインターが減算される場合、両方が同じ配列オブジェクトの要素を指すか、配列オブジェクトの最後の要素を1つ過ぎたものを指します。結果は、2つの配列要素の添え字の違いです。

(C11ドラフトN1570、セクション6.5.6、93および94ページの条項9。)

C11では正確に記述されていませんが、nullポインターは、が指すオブジェクトと同じ配列の一部ではないaため、ポインター演算の基本規則に違反しているため、動作は定義されていません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Visual Studio for C ++コードの例外の意味は何ですか

分類Dev

このコードの意味は何ですか?(ウィンドウ)、関数(a、b、c)

分類Dev

このCコードの脆弱性は何ですか?

分類Dev

このC ++コード内のバグは何ですか?

分類Dev

前処理されたC ++コードの#の意味は何ですか?

分類Dev

for(); 平均?これは何ですか; (セミコロン)は、{}ではなくcコードのfor()の後に来ることを意味しますか?

分類Dev

このMATLABコードに相当するC ++は何ですか?

分類Dev

このバブルソートコードでは、これらの変数cとdはCで何を意味しますか?

分類Dev

このObjective-cコードと同等のSwiftコードは何ですか?

分類Dev

//何ですか![0] Qt C ++サンプルコードの意味は?

分類Dev

Cでのこの式(char *)の意味は何ですか?

分類Dev

この余分なキーワードは、このc ++クラス宣言で何を意味しますか?

分類Dev

c#のこのコードに相当するものは何ですか

分類Dev

Objective-C:このコードはどういう意味ですか?

分類Dev

cとc ++のキーワードstaticの意味の違いは何ですか?

分類Dev

コマンド「ls -l / dev / tty」の結果の「c」の意味は何ですか?

分類Dev

C#で同等のこのJavaコードは何ですか?(setRequestEntity)

分類Dev

このC ++コードとこのPythonコードの違いは何ですか?

分類Dev

cの「argv ['A']」の意味は何ですか?

分類Dev

Cの「staticvoid *」の意味は何ですか?

分類Dev

cの**(&d)の意味は何ですか?

分類Dev

コマンド "> mean(c(1:10、50))"の50の意味は何ですか

分類Dev

このC ++コードでは技術的に何が起こりますか?

分類Dev

Cでの次のコードの出力は何ですか?

分類Dev

このコードで予想される例外は何ですか?C#

分類Dev

「C4649:このコンテキストでは属性は無視されます」の意味は何ですか?

分類Dev

C ++のコードはどういう意味ですか?

分類Dev

次のC ++コード行はどういう意味ですか?

分類Dev

cの*(揮発性ボイド**)の意味は何ですか?

Related 関連記事

  1. 1

    Visual Studio for C ++コードの例外の意味は何ですか

  2. 2

    このコードの意味は何ですか?(ウィンドウ)、関数(a、b、c)

  3. 3

    このCコードの脆弱性は何ですか?

  4. 4

    このC ++コード内のバグは何ですか?

  5. 5

    前処理されたC ++コードの#の意味は何ですか?

  6. 6

    for(); 平均?これは何ですか; (セミコロン)は、{}ではなくcコードのfor()の後に来ることを意味しますか?

  7. 7

    このMATLABコードに相当するC ++は何ですか?

  8. 8

    このバブルソートコードでは、これらの変数cとdはCで何を意味しますか?

  9. 9

    このObjective-cコードと同等のSwiftコードは何ですか?

  10. 10

    //何ですか![0] Qt C ++サンプルコードの意味は?

  11. 11

    Cでのこの式(char *)の意味は何ですか?

  12. 12

    この余分なキーワードは、このc ++クラス宣言で何を意味しますか?

  13. 13

    c#のこのコードに相当するものは何ですか

  14. 14

    Objective-C:このコードはどういう意味ですか?

  15. 15

    cとc ++のキーワードstaticの意味の違いは何ですか?

  16. 16

    コマンド「ls -l / dev / tty」の結果の「c」の意味は何ですか?

  17. 17

    C#で同等のこのJavaコードは何ですか?(setRequestEntity)

  18. 18

    このC ++コードとこのPythonコードの違いは何ですか?

  19. 19

    cの「argv ['A']」の意味は何ですか?

  20. 20

    Cの「staticvoid *」の意味は何ですか?

  21. 21

    cの**(&d)の意味は何ですか?

  22. 22

    コマンド "> mean(c(1:10、50))"の50の意味は何ですか

  23. 23

    このC ++コードでは技術的に何が起こりますか?

  24. 24

    Cでの次のコードの出力は何ですか?

  25. 25

    このコードで予想される例外は何ですか?C#

  26. 26

    「C4649:このコンテキストでは属性は無視されます」の意味は何ですか?

  27. 27

    C ++のコードはどういう意味ですか?

  28. 28

    次のC ++コード行はどういう意味ですか?

  29. 29

    cの*(揮発性ボイド**)の意味は何ですか?

ホットタグ

アーカイブ