質問: テキストを見ながら勉強しています。 ``` #include int main(void){ char moji_1[10], moji_2[10]; int i; printf("文字列を二つ入力してください(9文字以内):"); scanf("%s %s", moji_1, moji_2); for(i=0; i<10&& moji_1[i]&& moji_2[i]&& moji_1[i]==moji_2[i]; i++); if(moji_1[i]==moji_2[i]&& moji_1[i]=='\0'){ printf("入力した文字列は一致しています\n"); }else{ printf("入力した文字列は一致していません\n"); } return 0; } ``` このコードのfor文の式の`moji_1[i]&& moji_2[i]`がなぜ必要なのかが分かりません。 この文がないと動作しませんでしたが、`i<10`と `moji_1[i]==moji_2[i]`だけで十分ではと素人目ながら思ってしまいます。 どうか理由を教えてほしいです。
回答: 終端のヌル文字に達したときに脱出するためかと思います。 次のように書いた方が分かりやすいのでは。 ``` for(i=0; i<10; i++) { if(moji_1[i] == '\0') break; if(moji_2[i] == '\0') break; if(moji_1[i] != moji_2[i]) break; } ``` ちょっとfor文濫用し過ぎじゃないですかね。 なお、上記の条件を抜かすと、つまり次のように書くと... ``` for(i=0; i<10; i++) { if(moji_1[i] != moji_2[i]) break; } ``` ヌル文字に達していようがいまいが、10要素全てを比較しようとします。 終端以降の要素の値が一致する保証はありませんから、これはバグになります。 それに、初期化していない領域にアクセスするのはあまり行儀がよくないですよね。