- ベストアンサー
if文
if(num) if(num%2) っていうのは、どういう意味ですか? if(num%2==0) とかだったら分かるんですけど・・・
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
★余談? >★その違和感でコーディングミスに気づけばいいですね。 ↑ 警告をエラー扱いさせるオプションを指定すれば良いだけです。 ・質問にある >if(num%2) これは if(num%2==1) または if(num%2!=0) と同じになります。 動作的には奇数ならif内が『真』になります。 ・C/C++ではif文、switch文、for文、while文、do-while文の条件式は みんな0以外なら『真』、0なら『偽』となります。 あと気をつけないといけないことが1つ。 たとえば 『if( isupper(c) )』を分かりやすくする意味で 『if( isupper(c) == 1 )』とすると予期しない動作になります。 理由は isupper(c) のcが英大文字なら0以外『真』を返すとしか決まっていなく 『1』を返すか、『-1』か、あるいは『128』などでも0以外なので『真』として 正しいのです。どうせ記述するなら 『if( isupper(c) != 0 )』となりますが見苦しいので普通は 『if( isupper(c) )』とします。 なので『if ( num )』も num が0以外だけを判定したいなら『!= 0』を つけなくても良い気がします。特に num が0か、1しか取らないフラグ的ならね。 私の好みではフラグなら『if ( flag )』ですが、それ以外の数値なら 『if ( num != 0 )』としています。 ・今後の参考にして下さい。
その他の回答 (6)
- yama5140
- ベストアンサー率54% (136/250)
No4 です。 ★失礼しました、修正します。 ×1:if( iNum = 0 ) とすると、「代入判定」の冗長命令。 ×2:(↑常に「真」です) ○1:if( iNum = 0 ) としても、コンパイラはスルーし、実行しても iNum が 0 の時であってもこの if文命令は「思った」とおりに機能しない( == を = としたミスに気づきにくい)。 ○2:(↑常に「偽」です) ☆No5 さんご指摘ありがとう、ずっと間違えていました。 >if (0 == iNum) と書いてあると違和感を覚えるはずです. ★その違和感でコーディングミスに気づけばいいですね。
- Tacosan
- ベストアンサー率23% (3656/15482)
iNum = 0 は常に偽なんだけど>#4, それをさておいても if (0 == iNum) と「定数を先に書く」のは個人的にはお勧めしません. まず, この手法は「比較する一方が定数である場合」にのみ適用可能であり, 「左辺値 (例えば変数) 同士を比較する」場合には全く無力です. しかも, われわれは通常「x = 0 なら~」などと記述し「0 = x なら~」とは記述しませんから, if (0 == iNum) と書いてあると違和感を覚えるはずです. そんなことするくらいなら「エラーとして扱うようコンパイラを設定する」べきだと思います.
- yama5140
- ベストアンサー率54% (136/250)
(「どういう意味」かは No.1,2,3 さんの回答で・・) ☆ご質問主旨からちょっとズレて・・。 if( iNum = 0 ) // 「警告」 if( 0 = iNum ) // 「エラー」 ★これを逆手にとって(数との等値演算子の使用の場合) if( 0 != iNum ) か if( 0 == iNum ) と、 等値演算子の【前】に数を書く方をお奨めします。 ★理由 if( 0 == iNum ) とコーディングするところをミスして if( 0 = iNum ) とすると、・・・(↑)。 if( iNum == 0 ) とコーディングするところをミスして if( iNum = 0 ) とすると、「代入判定」の冗長命令。 (↑常に「真」です) コーディングの段階で、 《些末なミスは、コンパイラに任せる》 ような工夫(?)をしておけば、あとあと楽です。 ☆人間は、思わぬ所「だから」ミスをする。 ☆プログラムは「思った」とおりには動かない。 ☆プログラムは「命令」どおりに動く。 ★って、ずいぶん話がそれた、←年寄りのお家芸。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
もともと、Cには「論理型」というのがなかったのです。 ですから、条件が入るところというのは、すべからく、0なら不成立、0以外なら成立です。 ですから、 != を略しているというわけではないのですね。 ちなみに、もともとは、== も、「等しければ整数値1を、等しければ整数値0を返す」という演算子ですし、!は、!(0)は、1を、!(0以外)は、0を返す演算子です。 こういう仕掛けを利用して、if(num) のような表記をしているコードはまだそこそこ存在しています。 もともと、「0か0でないか」というのが基本ですから。 むしろ、 == や != は、「0か0でないか」という判断をベースにして、「等しい」や「等しくない」をわかりやすく表現し直したものでもあります。 また、これは、 if(isnum(c)) ... //(c が数値の時の処理) if(! isnum(c)) ... //(c が数値以外の時の処理) のように、isで始まる標準関数を使うときにも有効な考え方ですし、 while(idle()); // 通信などがアイドルの間待ち続ける if(error()) ... // エラーが発生したら など、== や != を伴わない使われ方も多く存在します。
- tatsu99
- ベストアンサー率52% (391/751)
if(num) これは、if (num != 0)とおなじことです。 if(num%2) これは、if (num%2 != 0) とおなじことです。 一般的に if (○)と書いたとき、 ○が0であれば、そのif文は成立しません。 ○が0でなければ、そのif文は成立します。 但し、そのような書き方よりは、誰にも判りやすいように if (○ !=0)か if (○ == 0)と 書く方を奨めます。
- shimix
- ベストアンサー率54% (865/1590)
・numやnum%2が0でなければtrue つまり、if(num==0) や if(num%2==0) の逆の真偽判定です。
お礼
!=0 を省いているってことですね。 わかりました、ありがとうございます。