[← 演習のページへ戻る]
サンプルプログラム 4 の内容三つの整数を読み込み,三つとも同じかどうか, それとも二つは同じかどうか, あるいはすべて異なるか,を表示する.1: #include <stdio.h> 2: 3: int main(void){ 4: int x, y, z; 5: 6: printf("整数を三つ入力してください:"); 7: scanf("%d %d %d", &x, &y, &z); 8: 9: if ( x == y && y == z ){ 10: printf("三つは等しいです\n"); 11: } 12: else{ 13: if ( x == y || y == z || z == x ){ 14: printf("二つは等しいです\n"); 15: } 16: else{ 17: printf("すべて異なっています\n"); 18: } 19: } 20: 21: return 0; 22: } 9-19 行目:外側の if ... else 文8: 9: if ( x == y && y == z ){ 10: printf("三つは等しいです\n"); 11: } 12: else{ 13: if ( x == y || y == z || z == x ){ 14: printf("二つは等しいです\n"); 15: } 16: else{ 17: printf("すべて異なっています\n"); 18: } 19: } 20:対象としている三つの整数の関係は次の 3 パターンに分類されます.
9 行目で x == y && y == z かどうかを確認しています. これが(1) に該当するかどうかの確認です. よくあるミスなのですが
この場合,まずは x == y が評価され,
つまり,z が 1 (または 0)に等しいかどうかの判定に置き換わってしまうんです. それゆえ,コンパイルでエラーにはならないのですが,うまく動かないという厄介なプログラムになってしまいます. 面倒でも必ず,二つずつを比較して,それらを合成しましょう.
13-18 行目:内側の if ... else 文8: 9: if ( x == y && y == z ){ 10: printf("三つは等しいです\n"); 11: } 12: else{ 13: if ( x == y || y == z || z == x ){ 14: printf("二つは等しいです\n"); 15: } 16: else{ 17: printf("すべて異なっています\n"); 18: } 19: } 20:9 行目の if 文で条件(x == y && y == z)が成立しない場合,この else 部分が実行されることになります.
つまり,
よって,わざわざ if ( x != y && y != z && z != x ){ ... } という三つ目の if 文を書く必要はないのです. |