【问题标题】:Comparing values: lvalue required as left operand of assignment比较值:需要左值作为赋值的左操作数
【发布时间】:2013-09-27 22:20:48
【问题描述】:

为什么我不能比较随机函数的结果?

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

int main (){

srand(time(NULL));

/*Player 1*/
int P1d1, P1d2, P1total;
P1d1 = 1 + rand() % 6;  //Rolls Player 1's first die; random # between 1-6
P1d2 = 1 + rand() % 6;  //Rolls Player 1's second die; random # between 1-6
P1total = P1d1 + P1d2;  //Takes total of both rolls

/*Player 2*/
int P2d1, P2d2, P2total;
P2d1 = 1 + rand() % 6; //Rolls Player 2's first die; random # between 1-6
P2d2 = 1 + rand() % 6; //Rolls Player 2's second die; random # between 1-6
P2total = P2d1 + P2d2; //Takes total of both rolls

if (P1d1 == P1d2 && P2d1 =! P2d2){ <--- ERROR HERE
    printf("Player 1 wins!\n");
    }
else if (P2d1 == P2d2 && P1d1 =! P1d2) {
    printf("Player 2 wins!\n");
    }
}

我收到错误消息error: lvalue required as left operand of assignment。

我理解这意味着赋值的左侧必须是一个变量,但左侧是一个变量(int P1d1)。有什么建议吗?

【问题讨论】:

  • 因为应该是==,而不是=。
  • 它仍然给出与 == 相同的错误消息
  • 这是 != 不是 =!这足够长了
  • 我会投票关闭,因为这与 Rand() 无关,并且将来不太可能帮助任何人。但我不知道正确的关闭原因。
  • @JonathonReinhart:这不应该被关闭,因为提问者显然已经在那里完成了自己的研究并陷入困境。我会投票修改问题名称,使其与“比较值的问题:需要左值作为赋值的左操作数”问题有关

标签: c random lvalue


【解决方案1】:

你可能需要使用==(相等)而不是=(赋值)。我看到你在你的问题中改变了这一点。

错误信息的原因是:

P2d1 =! P2d2

不等式运算符是!=,而不是=!。

按照你的写法,它是一个赋值=,后跟一个一元“非”!。由于= 的优先级很低,因此:

(P1d1 == P1d2 && P2d1 =! P2d2)

等价于:

((P1d1 == P1d2 && P2d1) = !P2d2)

当然(P1d1 == P1d2 &amp;&amp; P2d1) 不是分配的有效目标。

这是 C 编程中比较 ahem 有趣 的事情之一。在某些语言中,轻微的拼写错误可能会导致语法错误,以及编译器的错误消息很可能会准确地告诉您问题所在。在 C 语言中,轻微的拼写错误很容易导致代码在语法上仍然正确,但具有一些荒谬的含义——或者,在您的情况下,这会产生一个不太有启发性的错误消息。

如果您不理解编译器错误消息的含义,一个好的方法是忽略它所说的内容,并仔细查看编译器抱怨的最早的代码行。

【讨论】:

    【解决方案2】:

    = 是一个赋值运算符。 == 是比较运算符。

    【讨论】:

      【解决方案3】:

      使用!=。

      if (P1d1 == P1d2 && P2d1 =! P2d2){
      printf("Player 1 wins!\n");
      }
      

      与

      相同
      if ((P1d1 == P1d2 && P2d1) = (!(P2d2))){
      printf("Player 1 wins!\n");
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-03
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多