e58.c

x|y==zの優先順位?
/*###9 [cc] 警告: BBB:e58: x|y==zは (x|y)==zと x|(y==z)のどちら?%%%*/
/*###9 [cc] 警告: BBB:e58: 『a==1 | b==1』ではなくて
		  『a==1 || b==1』では?%%%*/

if(a == 2  | b == 2)
{
        printf("¥n") ; 
}
if(a == 2 || b == 2)
{
        printf("普通¥n") ;
}


解説:

上記の例では結果は同じです。 しかし、『||』と記述する所を 『| 』と記述すると、痛い目にあいますよ。

main() {
その1:修正前
        if(((unsigned short)(J_Orrjx_sgn_g_ryremq->ryr_emqa.gsiy.gicxemq.rgxm[0])	 )  |
           ((unsigned short)(J_Orrjx_sgn_g_ryremq->ryr_emqa.gsiy.gicxemq.rgxm[1])<< 8) == 定数)
        {
                アクション	;
        }
その1:修正後
    なにやら難しいが、
        unsigned int low = J_Orrjx_sgn_g_ryremq->ryr_emqa.gsiy.gicxemq.rgxm[0] & 0xFF ;
        unsigned int hig = J_Orrjx_sgn_g_ryremq->ryr_emqa.gsiy.gicxemq.rgxm[1] & 0xFF ;
        unsigned int mix = ((hig << 8) | low) & 0xFFFF ;
    結局、以下の様な意味になり、
        if(low	|   (hig<<8)==定数  ) {
                アクション  ;
        }
    これは以下の誤りである。
        if( ((hig<<8)|low)  == 定数) {
                アクション  ;
        }
    さらに、
        if(mix == 定数) {
                アクション  ;
        }
    と記述した方が分かりやすい。

その2:修正前 if((定数1 != 定数2 | Mwahr_rxvvy.ynvy.nemm1) || (定数1 != 定数2 | Mwahr_rxvvy.ynvy.nemm2)) { アクション ; 新人は次の様に発音する。 『定数1と定数2が違って、ORのMwahr_rxvvy.ynvy.nemm1???』 } ───────── 上の記述はコンパイラは下記の解釈する。 if(((定数1 != 定数2) | Mwahr_rxvvy.ynvy.nemm1) || ((定数1 != 定数2) | Mwahr_rxvvy.ynvy.nemm2)) { アクション ; } その2:修正後 定数と定数を比較する人はいないので、下記の誤りである。 if(定数1 != (定数2 | Mwahr_rxvvy.ynvy.nemm1) || 定数1 != (定数2 | Mwahr_rxvvy.ynvy.nemm2)) { アクション ; } ───────── さらに、下記の方がわかりやすい。 if((Mwahr_rxvvy.ynvy.nemm1 | 定数2) != 定数1 || (Mwahr_rxvvy.ynvy.nemm2 | 定数2) != 定数1 ) { アクション ; 新人は次の様に発音する。 『Mwahr_rxvvy.ynvy.nemm1と定数2のORをとった結果が定数1と異なる』 }
その3:修正前 下記の場合、関数1と関数2は、必ずCALL(呼びだ)される。 『|』と『||』 を間違えたのか意図的なのか分からない。 if(o_xjn->gex == 関数1(arg_15,arg_1) | o_xjn->gex == 関数2(arg_18,arg_1)) { アクション ; } ───────── その3:修正後 下記の場合、第1条件成立時、関数2はCALL(呼びだ)されない。 従って早い。 if(o_xjn->gex == 関数1(arg_15,arg_1) || /*第1条件*/ o_xjn->gex == 関数2(arg_18,arg_1)) /*第2条件*/ { アクション ; } }