有人可以解释一下“表达必须是可修改的左值”错误我一直得到吗?

时间:2016-02-15 19:59:34

标签: c syntax-error assignment-operator

我是C的新手并且在Project Euler上启动问题,无法理解错误,所以会感激任何帮助。

while (i < 10)
{
    if (i % 3 = 0);
    printf("%d", i);

    if (i % 5 = 0);
    printf("%d", i);

    i++;
}
  

“表达式必须是可修改的左值”

是错误。

2 个答案:

答案 0 :(得分:4)

当您使用=(即等于运算符)时,您正在使用==,它是赋值运算符。

您收到错误是因为您尝试将值分配给i % 3,这不是您可以分配的内容。

在C中有rvalues,它们是无法赋值的表达式,而lvalues是可以赋值的表达式。换句话说,左值可以出现在赋值的左侧,右值只出现在右侧。

此外,您的每个;语句后面都有一个if,这意味着它们的主体空白。摆脱那些。

while (i < 10)
{
    if (i % 3 == 0)
        printf("%d", i);

    if (i % 5 == 0)
        printf("%d", i);

    i++;
}

答案 1 :(得分:1)

首先,由于operator precedence,您的代码看起来像

if ( (i % 3) = 0);

现在,您使用的=是一个赋值运算符,根据C11,章节§6.5.16

  

赋值运算符应具有可修改的左值作为其左操作数。

OTOH,模运算符(%)的结果不是可修改的左值,因此您不断收到错误。

您需要将=更改为==,稍后再将其作为Equality运算符。

也就是说,;语句末尾的if也是你可能不想要的。如果希望;语句作为printf()条件语句(正文),则需要删除尾随if