- ベストアンサー
if( )の( )の中の意味
このプログラムは入力した文字列をカウントするプログラムなんですが、一部解からないところがあります。 20行目の *****if(word_in)***** です。 ()の中はどういった意味になるんでしょうか? たぶんですが、何か省略されてるんですよね? お願いします。 #include <stdio.h> main() { char c = '\0'; char prevletter; int wordnum; int word_in; while(1) { wordnum = 0; word_in =1; prevletter = '\0'; printf("文字列を入力してください:"); while(1) { c = getchar(); if(c == '\n') { if(word_in) wordnum++; break; } prevletter = c; if(c == ' ' || c == '.') { if(word_in) { wordnum++; word_in = 0; } } else word_in = 1; } if(prevletter == '\0') break; printf("ワード数:%d\n", wordnum); } }
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
while(1) //無限ループ { c = getchar();//標準入力から一文字取得 if(c == '\n')//今見ている文字が改行 { if(word_in)//今単語を見てたっけ? wordnum++;//改行は、スペースやピリオドではないが今着目していた単語の終わりでもあるので、単語があったとしてカウントを1増やす break;//改行が入力されたので、一行の入力の処理が終わったのでループを抜ける >if(word_in != 0) >との事ですが、'0'はどこから出てきたんでしょうか? >word_in = 1 なので、1の反対の意味の0何でしょうか? if(word_in)は、条件としてのword_inが0でない(非0)ということを意味するので、 #3の方はそれを補って書いたのであって、同じ意味だということです。 C言語では、0を偽(扱いで)でそれ以外を真としますので、そういう意味になります。 word_inは、単語の中を見ているというフラグなので、要は、非0ならなんでもいいわけですが、 word_in=0としている部分があるので、 0の時単語の中ではないという意味になります。 単語の中でないという意味を表すために word_in=-1としても良いですけど そうすると、逆に単語の中を意味するためには if(-1!=word_in)とかかなければなりません。 単語の中を意味するのに 単語の中でないを0で表現するようにしておけば、 if(word_in)の様に余計な(?)比較を省略できます。 ちなみに、このプログラムでは、入力した文字列が空白から始まる時には正しく動作しません。
その他の回答 (5)
- kaZho_em
- ベストアンサー率50% (2950/5879)
#3です。 > との事ですが、'0'はどこから出てきたんでしょうか? > word_in = 1 なので、1の反対の意味の0何でしょうか? 「どこから」と聞かれても困るのですが、#1、2の方もお書きの通り、変数word_inの値が真か疑かを 判断しています。 変数値が '0' であれば擬、'0' 以外であれば真ですから、word_in は 1 でも 2 でも 100 でも この判断文は成立します。 このプログラムでは 1 か 0 以外あり得ませんが。 > ・・・以降どういったに本文になりますか? while(1) { c = getchar(); /* 一文字取得 */ if(c == '\n') /* 改行コード? */ { if(word_in) /* word_in フラグは ( 前回のループで ) ゼロ・クリアされていない? */ /* ( すなわち、前の文字はスペースでもピリオドでも無かった ) */ wordnum++; /* 文字数カウンタ wordnum をインクリメント */ } break; /* 第2ループを抜ける */ } こんな感じですね。
- neKo_deux
- ベストアンサー率44% (5541/12319)
No.2です。 後半ウソでした。他の方の回答を参考にしてください。
- kaZho_em
- ベストアンサー率50% (2950/5879)
if(word_in) は、if(word_in != 0) と同等です。
- neKo_deux
- ベストアンサー率44% (5541/12319)
お手元のリファレンス・マニュアルやヘルプでifを調べてみて下さい。 VisualC++6.0のヘルプの場合ですと、 -----以下引用----- 式を評価した結果が 0 以外の値 (真) になると、この評価に応じたステートメントを実行します。結果が 0 (偽) となると、このステートメントはスキップされます。 -----以上引用----- となっていますので、word_inが0かどうかが評価されます。 -- > 何か省略されてるんですよね? 敢えて書くと、 if(word_in==0) ですね。
- tochanx
- ベストアンサー率37% (12/32)
if(word_in)のかっこの中、変数word_inが真であれば次を行うっていう意味です。 いちいちif(word_in <> 0)なんて書かなくても省略できるのです。
お礼
早々のお返事ありがとうございます。 if(word_in != 0) との事ですが、'0'はどこから出てきたんでしょうか? word_in = 1 なので、1の反対の意味の0何でしょうか? お願いします!
補足
このプログラムを日本語で書くと、 無限ループします。 1文字取得します。 もし、その取得した1文字が改行なら・・・。 ・・・以降どういったに本文になりますか? while(1) { c = getchar(); if(c == '\n') { if(word_in) wordnum++; break; までで良いのでお願いします!