プロが教えるわが家の防犯対策術!

下記は、「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);
return0;
}

A 回答 (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なので、こういう所が、
気になってしまうんですが、今は考える必要はないでしょう。
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/09/04 00:08

今回のような、「数値が0か非0か」という判定をする場合は、


真偽「!(i % 2)」よりも「i % 2 == 0」の方が、
おそらく直感的にわかりやすいのではないかと思います。

そう思っているのは私だけかもしれませんが…。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/04 00:10

FORTARN,BASIC,C,C++,C#,JAVA 等の言語では


数値を条件判断したときに、0ならfalse、0以外ならtrue
と判断されます。(これが出来ない処理系もあるかも知れないが)

なので、この場合も剰余が0ならfalse、1ならtrueとみなして
if文が解釈されます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/04 00:09

こんにちは



”i % 2”はiを2で割った余りを示すので、
偶数だと0、奇数だと1になります。

そこで、
iを2で割った余りが0ならば、を言い換えて
iを2で割った余りが1でないならば、という条件式になっています。
それがif ( ! ( i % 2 ) ) です。
※if文内は1がTrueになりますので。

ちなみに、仰る通り、i % 2 == 0で条件判定しても同じです。

以上です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/04 00:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!