web-dev-qa-db-ja.com

代入の左オペランドとして左辺値が必要です

なぜ私は

lvalue required as left operand of assignment

単一の文字列比較で? Cでこれを修正するにはどうすればよいですか?

if (strcmp("hello", "hello") = 0)

ありがとう!

22
Joseph

以下を割り当てずに比較する必要があります。

if (strcmp("hello", "hello") == 0)
                             ^

strcmp("hello", "hello")の結果が0と等しいかどうかを確認するためです。

エラーについて:

代入の左オペランドとして左辺値が必要です

lvalueは割り当て可能な値(変数)を意味し、割り当てでは=への左の値はlvalue(かなり明確)でなければなりません。

関数の結果と定数はどちらも割り当て可能ではない(rvalues)ので、rvaluesです。そのため、順序は関係なく、==の使用を忘れると、このエラーが発生します。 (編集:)私はそれを考慮します左側に定数を置くことと比較して良い習慣なので、=の代わりに==を書くと、あなたはコンパイルエラーが発生します。例えば:

int a = 5;
if (a = 0) // Always evaluated as false, no error.
{
    //...
}

vs.

int a = 5;
if (0 = a) // Generates compilation error, you cannot assign a to 0 (rvalue)
{
    //...
}

(この質問に対する最初の回答を参照してください: https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined

43
MByD

右辺値に右辺値を割り当てることはできません。

if (strcmp("hello", "hello") = 0)

間違っている。提案:

if (strcmp("hello", "hello") == 0)
                              ^

=assign演算子です。
==等しい演算子です。
多くの新しいプログラマーがこの事実と混同していることを知っています。

7
EKons

_=_を_==_に変更します。つまり、if (strcmp("hello", "hello") == 0)

strcmp()の結果を0と比較したいので、_==_が必要です。右辺値を割り当てることができないため、0に割り当てても機能しません。

4
Prasoon Saurav

関数に値を割り当てようとしていますが、これはCでは不可能です。代わりに比較演算子を試してください。

if (strcmp("hello", "hello") == 0)
3
user142019

数学を扱うときのこの問題への答えは、左側の演算子は変更しようとしている変数でなければならないということです。ロジックが最初に来ることはできません。

coin1 + coin2 + coin3 = coinTotal; // Wrong

coinTotal = coin1 + coin2 + coin3; // Right

これはあなたの質問に対する直接的な答えではありませんが、私がグーグルで検索したものと同じものをグーグルで検索する将来の人々に役立つかもしれません。

1
Thomas
if (strcmp("hello", "hello") = 0)

左辺値ではない関数の戻り値に0を割り当てようとしています。

関数の戻り値は左辺値ではない(そのためのストレージがない)ため、左辺値ではないものに値を割り当てようとするとエラーになります。

条件が比較の左側で定数値を使用する場合にこのような間違いを避けるためのベストプラクティスです。したがって、「==」の代わりに「=」を使用しても、lvalueではない定数はすぐにエラーになり、誤って値が割り当てられてfalseが発生するのを防ぎます条件が正の場合。

0