
warning: operator ‘?:’ has lower precedence than ‘|’; ‘|’ will be evaluated first
警告: 演算子 ‘?:’ は ‘|’ よりも優先順位が低い; ‘|’ が先に評価される
[-Wbitwise-conditional-parentheses]
■1.簡潔な式を書く時三項演算子は便利
#include <stdio.h>
int main(void)
{
for(int i = 0 ;i < 10;i++){
for(int j = 0 ; j < 10 ;j++){
int max = (i > j) ? i : j;//★推奨
printf("%dと%dの最大値は%d\n",i,j,max);
}
}
}
聖典 プログラミング言語Cで紹介されている例です。

■2.三項演算子は単純分岐に便利
#include <stdio.h>
#include <time.h>
int main(void){
int 西暦;
printf("西暦入れて\n");
scanf("%d",&西暦);
printf("%d年は%s\n",
西暦,
__isleap(西暦)?
"閏年です":
"閏年ではありません"
);
}
適当に改行すると
if文より簡潔で理解しやすくないですか?

■3.複雑な式に三項演算子は不適切
int f(int flg) {//NG
int x = 0x80 | (flg == 0) ? 0 : 0xFF00 ;
return x;
}
0x80 | (flg == 0) ? 0 : 0xFF00 ;は、コンパイラによって
(0x80 | (flg == 0)) ? 0 :0xFF00 ;と解釈されるので、
flg の値に無関係に(0x80 | (flg == 0)) は真と評価されます。
■4.カッコを付けて結合力を明確に
int g(int flg) {//OK
int y = 0x80 | ((flg == 0) ? 0 : 0xFF00) ;
return y;
}
((flg == 0) ? 0 : 0xFF00)のように
3項演算子にカッコつけると良いのですが、
if文で書いたほうが良いかも。
■5.複雑な式は素直にif文を使う
int g(int flg) {
if(flg == 0) return 0x80;
else return 0xFF00 | 0x80;
}