忍者ブログ

素人翻訳

適当に翻訳する。

ポインタの比較

出典:http://www.velocityreviews.com/forums/t437615-whats-the-help-of-unnecessary-pointer-comparison.html
baumann@pan Guest Posts: n/a 2005年6月4日

皆さんに質問。

「不必要な」ポインタの比較が理解できない。

/*
207 * min()/max() マクロは
208 * 厳格な型の審査をも行う。
209 * 「不必要な」ポインタ比較の項を参照。
210 */
211 #define min(x,y) ({ \
212 typeof(x) _x = (x); \
213 typeof(y) _y = (y); \
214 (void) (&_x == &_y); \
215 _x < _y ? _x : _y; })
216
217 #define max(x,y) ({ \
218 typeof(x) _x = (x); \
219 typeof(y) _y = (y); \
220 (void) (&_x == &_y); \
221 _x > _y ? _x : _y; })
222

214行と220行にはどのような意味があるのか?

両方とも結果は常に「FALSE」になると思っている。というのは、&_x は局所変数 _x の番地(address)であり、&_y は局所変数 _y の番地(address)だから。

だからこの「不必要な」ポインタ比較の意味が分からない。

誰か説明できる人?

baumann@pan

Ben Pfaff Guest Posts: n/a 2005年6月4日

「baumann@pan」の書き込み:

> 「不必要な」ポインタの比較が理解できない。
>
> 211 #define min(x,y) ({ \
> 212 typeof(x) _x = (x); \
> 213 typeof(y) _y = (y); \
> 214 (void) (&_x == &_y); \
> 215 _x < _y ? _x : _y; })

これは gcc 拡張機能を使っている。番地(address)を比較することで、_x と _y が同じ型を持つことを保証するのが214行の狙い。_x と _y が同じ型を持つ場合に限り、それらのポインタも同じ型を持つ。比較の結果は無視されるので、_x と _y が比較不能な型を持っていた場合にコンパイラが診断を始める、というのが唯一の効果。

異なる型の値から生み出された最小値の取得を回避することが目的。なぜなら、そのような最小値を用いると予期せぬ結果が待っているから。例えば次のような宣言があるとする
int x = -1;
unsigned y = 1;
「x > y ? x : y」の値は UINT_MAX である。この種の予期せぬ結果は x と y の両方が int 型なら起こらない。

Ben Pfaff
email:
web: http://benpfaff.org

Keith Thompson Guest Posts: n/a 2005年6月4日

「baumann@pan」の書き込み:

> 「不必要な」ポインタの比較が理解できない。
>
> /*
> 207 * min()/max() マクロは
> 208 * 厳格な型の審査をも行う。
> 209 * 「不必要な」ポインタ比較の項を参照。
> 210 */
> 211 #define min(x,y) ({ \
> 212 typeof(x) _x = (x); \
> 213 typeof(y) _y = (y); \
> 214 (void) (&_x == &_y); \
> 215 _x < _y ? _x : _y; })
> 216
> 217 #define max(x,y) ({ \
> 218 typeof(x) _x = (x); \
> 219 typeof(y) _y = (y); \
> 220 (void) (&_x == &_y); \
> 221 _x > _y ? _x : _y; })
> 222
>
>
> 214行と220行にはどのような意味があるのか?
>
> 両方とも結果は常に「FALSE」になると思っている。というのは、
> &_x は局所変数 _x の番地(address)であり、&_y は局所変数 _y の番地(address)だから。
>
>
> だからこの「不必要な」ポインタ比較の意味が分からない。
>

しかし、どちらのマクロも移植性が極端に低い。typeof() 演算子と文の表現は共に gcc 拡張機能であり、標準 C には含まれていない。

<OT>
typeof() という名前からも分かるように、_x は x と同じ型を持ち、_y は y と同じ型を持つ。_x と _y の番地(address)比較は、これらが同じ型を持つ時は必ず成功し、同じ型を持たない時は成功しない。結果は関係なく、捨てられる。重要なのは、引数の型が一致しなかった場合にコンパイラがマクロ呼び出しを拒絶するようにしていること。
</OT>

Keith Thompson (The_Other_Keith) kst- <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.

Christian Bau Guest Posts: n/a 2005年7月4日

< .com> の記事における
「baumann@pan」 <> の書き込み:

> 皆さんに質問。
>
> 「不必要な」ポインタの比較が理解できない。
>
> /*
> 207 * min()/max() マクロは
> 208 * 厳格な型の審査をも行う。
> 209 * 「不必要な」ポインタ比較の項を参照。
> 210 */
> 211 #define min(x,y) ({ \
> 212 typeof(x) _x = (x); \
> 213 typeof(y) _y = (y); \
> 214 (void) (&_x == &_y); \
> 215 _x < _y ? _x : _y; })
> 216
> 217 #define max(x,y) ({ \
> 218 typeof(x) _x = (x); \
> 219 typeof(y) _y = (y); \
> 220 (void) (&_x == &_y); \
> 221 _x > _y ? _x : _y; })
> 222
>
>
> 214行と220行にはどのような意味があるのか?
>
> 両方とも結果は常に「FALSE」になると思っている。というのは、
> &_x は局所変数 _x の番地(address)であり、&_y は局所変数 _y の番地(address)だから。
>
>
> だからこの「不必要な」ポインタ比較の意味が分からない。
>
> 誰か説明できる人?

これが C でないという事実はともかく、多分 C と似た言語だろう。

min(2, 4.7f) を試そう。通るか? 動くか?

PR

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

カレンダー

06 2020/07 08
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

最新コメント

[04/05 NONAME]

ブログ内検索

広告

バーコード

広告