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条件*/
{
アクション ;
}
}