• ベストアンサー

実行すると if文 に矛盾

#include <stdio.h> #include <math.h> int main(void) { /* */ double c, l, m, n, w=1, x[4]={1,2,3,4}, y[4]={1,2,3,4}; /* */ int j, k, u, v; /* */ for(j=0; j<3; j++){ /*   */ for(k=j+1; k<4; k++){ /*     */ l = sqrt( pow(x[j]-x[k], 2) + pow(y[j]-y[k], 2) ); /*     */ m = sqrt( pow(x[j], 2) + pow(y[j], 2) ); /*     */ n = sqrt( pow(x[k], 2) + pow(y[k], 2) ); /*     */ c = ( pow(m, 2) + pow(n, 2) - pow(l, 2) ) / (2*m*n); /*☆    */ /* if(c=w) ; */ /*※    */ if(c<=w){ /*       */ w = c; /*       */ u = j; /*       */ v = k; /*●    */ } else if(c>w){ /*       */ if(c=w) /*         */ printf("no way\n"); /*     */ } /*   */ } /* */ } /* */ printf("[ P%d P%d ]\n", u, v); /* */ return(0); } -------------------------------------------------------------------------------- 上記プログラムなのですが、Visual C++ でこれを実行すると、 ------------------------------ no way no way no way no way [ P0 P2 ] Press any key to continue ------------------------------ と出力されてしまいました。 ☆行のif文のコメントを外して直前で c=w を評価すると、※の部分が正常に処理されました。 なぜこのような矛盾が生じているのでしょうか? 何かご意見いただければ幸いです。 ※今回 Visual C++ でしか実行できるものがなかったため、他では確認できておりません。恐縮です。 ※この投稿の文字量の制限のため、プログラムの解説は割愛しました; ※補足などでお伝えできればよいのですが…。

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

  • ベストアンサー
noname#96023
noname#96023
回答No.1

全文は見てませんが if(c=w) ; wをcに代入なので、次のifでマッチするのは当然です。 比較するなら==でしょう

quads
質問者

お礼

回答ありがとうございます。 みなさまに指摘いただきましたが、比較演算子を誤っていたため私が錯覚してしまいました。 お恥ずかしい限りです。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★回答者 #1 #2 さんと同じで printf("no way\n"); の上にある if(c=w) の部分が『矛盾』ってことだ。 ・比較演算子ならが if(c==w) となる。 ・代入演算子ならば if((c=w) != 0) としましょう。 ・それから if(c=w) ; の行は条件式が真になると、次のセミコロンを処理する。  このセミコロンだけの記述は『空文』という言い方があり、繰り返し文の中では使ったりする。 補足:『空文』の使用例 int StrLen( const char *string ) {  const char *p;    for ( p = string ; *p != '\0' ; p++ ){   ;←『空文』  }  return( p - string ); } 解説: ・上記のソースは、単純に文字列の長さを返す処理です。 ・本来、for文のブロックの中には何も記述しなくても良い。  でも、何もないと記述し忘れたと誤解される為に『空文』として  セミコロンだけを記述するちょっとした可読性のコツだよ! ・また、for文のブロックを記述しないときには、セミコロンだけの  『空文』を絶対に記述しないと次の return( p - string ); が  for文の繰り返し処理として実行されます。 最後に: ・☆の行の部分は if文と空文で1つの処理を正常に行うため、  ※の行に影響は全くでないため正常に処理されるのですよ。

quads
質問者

お礼

回答ありがとうございます。 みなさまに指摘いただきましたが、比較演算子を誤っていたため私が錯覚してしまいました。 錯覚したため、原因の追求に関して頓珍漢な考察をしてしまいました。 お恥ずかしい限りです。 空文については理解しておりますが前述の通りです。 説明いただき誠に恐縮です。 なお、皆様にご指摘いただき検証したところ、 元の if文 が理想通りに評価されていない原因が桁落ちによる誤差であると分かりました。 2乗根を取って2乗していたのですが、この値がずれていました。 比較する変数に格納する値に関して、式の変形をし、根号を含ませないよう対処いたしました。 扱えない桁数での四捨五入はしょうがないものの、大小関係の比較は正常に行なえました。 こちらで結果報告をさせていただきました。 失礼致します。

すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

if文の 比較演算子のつもりで使った=が 代入になっているのが原因かも 比較演算子は == しないといけません if ( c = w ) では wが0以外なら真となります if ( c == w ) なら c = wの場合真です # 実行結果と期待する結果ぐらいは書きましょうね...

quads
質問者

お礼

回答ありがとうございます。 みなさまに指摘いただきましたが、比較演算子を誤っていたため私が錯覚してしまいました。 期待する結果をプログラムの解説と併せて記述しようとしたら文字数制限に弾かれてしまいました。 示せず恐縮です。

すると、全ての回答が全文表示されます。

関連するQ&A