HmJre.dllのソースに関してNo.03924
あべのり さん 04/01/26 21:26
 
こんばんわ,いつもお世話になってます.

特に支障があるわけではないのですが気になったのでお聞きします.公開なされてい
るHmJre1.06のソースですが,Compile.cppの190行目に

if( *psz < '0' | *psz > '9' ) {

という一行がありますが,手元のVC++.NETでコンパイルすると

warning C4554: '|' : 演算子の優先順位に問題があります。カッコを使用して優先
順位を明確にしてください

と警告が出ます.ここはどのような意図なのでしょうか?

# |が一本足りないのかなぁ?と勝手に思ってたりするのですが......

[ ]
RE:03924 HmJre.dllのソースに関してNo.03926
アルビレオ さん 04/01/26 23:00
 
ユーザーのアルビレオです。

>if( *psz < '0' | *psz > '9' ) {
>
>という一行がありますが,手元のVC++.NETでコンパイルすると
>
>warning C4554: '|' : 演算子の優先順位に問題があります。カッコを使用して優先
>順位を明確にしてください
>
>と警告が出ます.ここはどのような意図なのでしょうか?

これはこれで正しいソースです。
何らかの意図があるのはコンパイラの方でして…
以下は純粋にC言語とコンパイラの話です。

if( a + b > 0 )
という式が書かれていた場合、普通なら人間は「aとbを足した結果が0より大き
い」という意味に受け取ります。
この「人間の感覚」に合わせるためにCの仕様として「比較演算子は算術演算子
より優先順位が低い」というルールになっています。
ところが「|」や「&」は例外的に比較演算子より低い優先順位になります。
(C言語の歴史的な事情からこうなったのですが、長くなるので理由は省略)
この結果、
if( a | b > 0 )
という式は一見「(a | b) > 0」という意味に見えますが、上に書いたルールに
よってコンパイラは「a | (b > 0)」と解釈します。
これはわりとよくある間違いなので、たいていのコンパイラでは「|」や「&」と
比較演算子がかっこなしで並んでいた場合は警告を出すようになっています。

元のソースは「*psz < ('0' | *psz) > '9'」ではなく「(*psz < '0') | (*psz
 > '9')」という意図であることはひと目でわかりますよね?
つまりCの仕様どおりの優先順位の評価で問題ありません。
でもコンパイラは「ひょっとしたら間違っているのかも」と警告を出しているわ
けです。

># |が一本足りないのかなぁ?と勝手に思ってたりするのですが......

おっしゃるとおり「|」を「||」にすれば警告は出なくなりますが、動作はいっ
しょです。警告が出るか出ないかの違いしかありません。
(ひょっとすると、最適化の結果には違いがあるかもしれませんが)

※おまけ
「if( (BYTE)(*psz - '0')  <= 9 )」と書くと一回の比較ですむので、ちょっぴ
り高速化できます。
でもよほどのことがない限りは、こんなひどいコードは書かない方がいいです。

[ ]
RE:03926 HmJre.dllのソースに関してNo.03927
Arimac さん 04/01/26 23:57
 
「|」は両辺の式を実行するのに対し
「||」は左が真だと右は実行しないので、
ちょっとだけ速い事が期待できます(^^;

[ ]
RE:03927 HmJre.dllのソースに関してNo.03938
あべのり さん 04/01/27 20:38
 
> アルビレオさん
丁寧な説明ありがとうございます.

> おっしゃるとおり「|」を「||」にすれば警告は出なくなりますが、動作はいっし
>ょです。警告が出るか出ないかの違いしかありません。
> (ひょっとすると、最適化の結果には違いがあるかもしれませんが)

動作は一緒でも,イメージとして「|」はbit演算のORですが,「||」は「または」の
意味だというイメージがあるので,「||」の方が普通なんじゃないかなぁ?と思い質
問した次第です.とりあえず手元では「||」にして使用することにします.

>「|」は両辺の式を実行するのに対し
>「||」は左が真だと右は実行しないので、
>ちょっとだけ速い事が期待できます(^^;
あ,成る程(笑)

[ ]
RE:03938 HmJre.dllのソースに関してNo.03947
秀まるお さん 04/01/29 18:32
 
 たまたまここの会議室を見ていたらこんな話題があるようで…。

 「|」を使ってるのは、僕の間違いです。「||」にすべきだと思います。

 たまたま同じ動作になってるようなので、特にバグ修正のバージョンアップは
しませんが、手元のソースコードは直しておきます。

[ ]
RE:03947 HmJre.dllのソースに関してNo.03952
あべのり さん 04/01/30 00:23
 
> たまたまここの会議室を見ていたらこんな話題があるようで…。
こちらに書くのはまずかったでしょうか?

> 「|」を使ってるのは、僕の間違いです。「||」にすべきだと思います。
ありがとうございます.安心しました.
# 警告出なかったんでしょうかね……?

[ ]