• ベストアンサー

C言語 偶数判定

下記は、「1から5までの整数で偶数の和を表示する」というプログラムなのですが、 偶数判定に用いている if ( ! ( i % 2 ) ) の意味が分からないので、どなたか教えていただけないでしょうか? ( i % 2 = = 0 で条件判定をするのなら理解できるのですが…) #include <stdio.h> int main(){ int i=1,total=0; while (1){ if(i>5)break; if ( ! ( i % 2 ) ) total+=i; i++; } printf("%d",total); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
noname#92327
noname#92327
回答No.1

こんにちは ”i % 2”はiを2で割った余りを示すので、 偶数だと0、奇数だと1になります。 そこで、 iを2で割った余りが0ならば、を言い換えて iを2で割った余りが1でないならば、という条件式になっています。 それがif ( ! ( i % 2 ) ) です。 ※if文内は1がTrueになりますので。 ちなみに、仰る通り、i % 2 == 0で条件判定しても同じです。 以上です。

re999
質問者

お礼

AD797さん、ご回答ありがとうございました。

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

( i % 2 )は「iを2で割った時の余り」を得る算術式です。 C言語では0は偽、0以外は真です。また"!"は論理否定を表します。 つまり、!(i % 2)は「iを2で割った時の余りが真(非0)、でない場合」 =「iを2で割った時の余りが偽(0)である場合」と解釈します。 コンピュータは2進法ですから、一の位(2^0)が1なら奇数、0なら偶数です。 よって、!(i & 1)でも同じ結果が得られます。 余談ですが、全く最適化を行わない場合、i % 2 は除算命令が、 i & 2 は論理積命令が生成されます。論理積命令の方が高速です。 昔の遅いCPUの時代からやっているジジイSEなので、こういう所が、 気になってしまうんですが、今は考える必要はないでしょう。

re999
質問者

お礼

nda23さん、ご回答ありがとうございました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

今回のような、「数値が0か非0か」という判定をする場合は、 真偽「!(i % 2)」よりも「i % 2 == 0」の方が、 おそらく直感的にわかりやすいのではないかと思います。 そう思っているのは私だけかもしれませんが…。

re999
質問者

お礼

asuncionさん、ご回答ありがとうございました。

回答No.2

FORTARN,BASIC,C,C++,C#,JAVA 等の言語では 数値を条件判断したときに、0ならfalse、0以外ならtrue と判断されます。(これが出来ない処理系もあるかも知れないが) なので、この場合も剰余が0ならfalse、1ならtrueとみなして if文が解釈されます。

re999
質問者

お礼

Hayashi_Trekさん、ご回答ありがとうございました。

関連するQ&A

専門家に質問してみよう