-6

私はこのコードを持っていますが、理解できないことがあります

次のコードをコンパイルすると:

#include <stdio.h>
#include <stdlib.h>


int main() {

double x=1;
double y=0;

  if (x!=y)
  {
    printf("x!=y\n");
  }
  if (x=y)
  {
  printf("x=y\n");
  }

  return 0;
}

次の警告が表示されます。

プログラムを実行すると、次の出力が得られます

x!=y
x=y

「=」が比較ではなく、yにある値をxに入れるだけの場合、なぜx = yを出力するのですか。

4

6 に答える 6

8

x = yコンパイラは、式の結果が条件内で使用されていることを警告しています。あなたの実際の質問に関連しているようには見えませんが、これについて言及ます==.

質問に関して: は(a ) にx = y評価され、ゼロであるため、結果は C 標準がそうすべきだと言っているためです。6.3.1.2 から:ydoubleyfalse

スカラー値が _Bool に変換されるとき、値が 0 と等しい場合、結果は 0 になります。それ以外の場合、結果は 1 です。

したがって、このコードを実行すると、「equals」メッセージが出力されませ

于 2012-10-31T14:40:18.880 に答える
1

間違った演算子を使用しています:=は割り当てで==あり、実際の比較です(等しい)。コンパイラはこれを検出し、これが意図されていない可能性がある場合に備えて警告します(割り当てではなく比較を行うことを意図している可能性がはるかに高くなります)。これは完全に有効なCです(したがって、これは単なる警告であり、エラーはありません)。意図的なものであることを確認するために、次の前後に角かっこを追加するように求められますif ((x=y))。これによりコード的に違いが生じることはありませんが、戻り値がそれ自体で使用され、割り当てがその一部にすぎないことを示しています(説明が難しい)。

編集:割り当てにより、両方の行が印刷されます。

  • x!=ytrueと評価されます-そのため、最初の行が出力されます。
  • x=yは割り当てであり、これは基本的xに、の値を取る必要があることを示しています。この場合yはです。0

そのため、2行目は(falseと評価されるように)記述すべきではありません0が、一般的には、バグまたは精度エラーのいずれかであると言えます(これは、の単純な割り当てでは発生しないはず0ですが、わかりません) 。

于 2012-10-31T14:36:53.973 に答える
1
if (x!=y)           // This tests if x is not the same value as y
{
  printf("x!=y\n"); // if x is not the same value as y print this
}

if (x=y)            // This assigns x the value of y, the tests the new value of x
{
  printf("x=y\n");  // if y was not 0, then print this
}

私はあなたが欲しかったと思います:

if (x == y) // if x is the same value as y

2回目のチェックのために

編集
コメントを読んだ後、両方のプリントを取得していることがわかります...使用しているコンパイラはわかりませんが、結果を再現できません。コードが正しくコピーされていますか? x!=y実行すると、説明どおりに期待どおりにしか取得できません。

コードをgccで実行すると、正しく表示されます...私が考えることができるのは、奇妙な非C標準コンパイラで実行していて、yを割り当てる前にxの値をチェックしていることだけです。

于 2012-10-31T14:37:50.917 に答える
0

等式演算は===代入演算子です。

正しい形式ですif(x == y)が、それも実行されますif(x=y)

この場合、が最初に評価され 、その後にx=y値が割り当てyられるxと、式はとして扱われ if(x)、次に評価されるためです。

そして今ここにある場合はxfalseとして扱われ、そうでない場合はtrueとして扱われます。0if(x)

したがって、x=y出力として印刷されません。

于 2012-10-31T14:37:31.883 に答える
0

Daniel Fischer があなたの質問に答えました。x=y かどうかをテストしています。そうではないので、最初のテストは真です。次に、y を x に割り当てます。これは、機能したときに true を返し、2 番目の print ステートメントを出力します。

于 2012-10-31T14:38:36.540 に答える
0

おそらくタイプミスをしている可能性があることを示唆しています。

通常、次のものがあります。

if(condition)

あなたの場合、条件は割り当てであるため、常に true と評価される場合、コンパイラからの提案です。

于 2012-10-31T14:37:36.823 に答える