- ベストアンサー
if、else ifの使い方について
当方プログラミング初心者のため、拙い文章になってしまう可能性があることをご了承ください */関数ここから/* int nisu( int year,int tuki ){ int nissu; if(tuki == 2){ nissu=feb(year); } else if(tuki == 4 && tuki == 6 && tuki == 9 && tuki == 11){ nissu=30; } else{ nissu=31; } return(nissu); } */関数ここまで/* 以上の関数を作成し、別の関数内において m_nisu=nisu(year,tuki); printf("%d\n",m_nisu); を実行すると、tukiが2のときは思ったとおりの値が表示される(よって、関数feb(year)の説明は省略します)のですが、それ以外の値を指定した時には、必ず31が表示されてしまいます。 また、 tuki == 4 && tuki == 6 && tuki == 9 && tuki == 11 の部分を、 tuki == (4)||(6)||(9)||(11) に書き換えると、何故か必ず30が表示されてしまいます。 まったく理由が思いつかないので、よろしければご教授願います。 他に必要な情報がございましたら遠慮なくおっしゃって下さい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
論理演算についての理解が曖昧なようですね。 tuki == 4 && tuki == 6 && tuki == 9 && tuki == 11 これは、「4月であり、かつ6月であり、かつ9月であり、しかも11月である」という意味になり、当然こんなことはあり得ません。 tuki == (4)||(6)||(9)||(11) これは、「4月であるか、又は6という数字は0でないか、又は9という数字は0でないか、又は11という数字は0でない」という意味であり、後半3個は必ず満たすので、必ずここを通るわけです。 ご希望の動作を推測すると、 tuki==4 || tuki==6 || tuki==9 || tuki==11 で出来ると思います。ただ、本来こういった場合はswitch文の方が適切です。
その他の回答 (2)
- yama5140
- ベストアンサー率54% (136/250)
(既に明快な「回答」が出ていますので、「アドバイス」です) ★ else if を用いないと、 nissu = 31; // ◆ if( 2 == tuki ) nissu = feb( year ); if( 4 == tuki || 6 == tuki || 9 == tuki || 11 == tuki ) nissu = 30; と、該当部分をスッキリ(?)書くことができます。 質問者様のソースは、 ・まず例外(2月他)を処理し、最後に大多数(◆)の処理、となっています。 ひねくれ者の年寄りのもの(↑)は、 ・まず大多数の処理、次に例外の処理、です。 ☆時としてプログラムは、このような「ひねくれ」がスッキリすることもあるようです。 バス降車時(運賃780円)に、両替した小銭1000円から220円を手元に残し、残り全部を料金箱に入れるのが私にとっては「普通」ですが、女房に言わせると、780円を数えて料金箱に入れるのが「普通」で、私の方法は「ひねくれ」とのことです。 ☆実生活だって、「ひねくれ」が「楽」なこともあります。 ------------------------------------------------- ★ご質問主旨の「 if、else if 」を使わないで、 int igNissu[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; とグローバルで定義(テーブル化)し、使うときに igNissu[1] = ( iYear % 4 ) ? 28 : 29; ・ ・ nissu = igNissu[ tuki - 1 ]; とする方法もあります(うるう年の例外割愛)。
お礼
プログラムを始めたばかりで、実はひとつのプログラムを作るのに何通りもの表現方法があるという点に混乱してきています。 参考にさせていただきますね。
- auty
- ベストアンサー率58% (284/486)
tuki == 4 && tuki == 6 && tuki == 9 && tuki == 11 でも tuki == (4)||(6)||(9)||(11) でもなく tuki == 4 || tuki == 6 || tuki == 9 || tuki == 11 としてください。
お礼
回答ありがとうございます。
お礼
tuki == 4 && tuki == 6 && tuki == 9 && tuki == 11 に関してはよくよく考えたら間違いなのは当たり前でしたね。 ちょっとあせりすぎていたのかも。 tuki == (4)||(6)||(9)||(11) に関してはなぜ間違いなのかさっぱり検討もつかなかったので、とても参考になりました。 ありがとうございました。