• ベストアンサー

while文の判定について(C言語)

while文の判定についてです たぶんすごいつまらないミスなので時間の余っている方 ご指導ください<_ _> (自分ではいろいろ調べましたが原因がわかりません><、) returnやbreakを使わないで二分探索を終了させよとの問題で low-highで2ならばデータが見つかったとき 1ならば見つからなかったときという判定で whileで抜けさせたいのですがどうしても抜けません><、 論理演算子の使い方が間違っているのでしょうか? #include<stdio.h> #define N 10 int main(void) { static int a[]={2,3,4,11,31,50,55,70,77,80}; int key,low,high,mid; high=N-1; low=0; int i=0; printf("検索するdata ? :");scanf("%d",&key); ここです while((2!=(low-high)) || (1!=(low-high))){ mid=(low+high)/2; if(a[mid]==key){ low=mid+1; high=mid-1; } else if(a[mid]<key){ low=mid+1; } else{ high=mid-1; } } if(2==(low-high)){ printf("%2dは%2d番目にありました",key,mid); } else{ printf( "見つかりませんでした" ); } return 0; } while内でlow-highをprintfで出力しましたが2と1が出力されました

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

  • ベストアンサー
  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

今の条件判定だと 「low-highが1ではない」か、「low-highが2ではない」間以下の処理を続けろと言うことなので、たとえばlow-highが1だと、「2」ではないので続けてしまいますし、low-highが2だと「1」ではないので処理を続けてしまいます。 whileは条件が成り立つ間と言うことなのでor条件だとどっちかが成り立てば処理を続けてしまいます。 この辺をゆっくり考えてみましょう。

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

while((2 != (low-high)) || (1 != (low-high))){ だとlow-highが2のときは(1 != (low-high))に該当しますしlow-highが1のときは(2 != (low-high))に該当します while((2 != (low-high)) && (1 != (low-high))){ ではないでしょうか

hisetu_001
質問者

お礼

回答ありがとうございます<_ _> そうですよね・・・ !=で「そうでない間」というのがわかっていて ||では条件が満たされてしまいます--; 何故こういったことが解らないのか・・・ 自分が嫌になります><、 貴重な時間を割いてご指導して頂き 本当にありがとうございました<_ _>