【问题标题】:(c) expression must be a modifiable lvalue(c) 表达式必须是可修改的左值
【发布时间】:2014-11-15 12:24:31
【问题描述】:
if (operation = '+' || operation = '-' || operation = '*' || operation = '/' || operation = '%')//error line
    {
        printf("Enter the first operand:\t\t");
        getchar();
        scanf("%d", &num1);
        printf("Enter the second operand:\t\t");
        getchar();
        scanf("%d", &num2);
}

它给出一个错误说:

Error: expresion must be a modifiable value

它给了我关于 if 行的错误,除了那个说的那个之外的所有论点

operation = '%'

有什么问题?? 谢谢你们:)

【问题讨论】:

  • = 是赋值,== 比较。
  • 你在if声明中一定是指==
  • (不相关)您不应该将getchar() 的结果存储在某处吗?
  • @Jongware ,我认为他们被安排吃\nscanfs 遗漏的@s

标签: c if-statement lvalue


【解决方案1】:

你打错了,而不是比较运算符 == 你写了赋值运算符 =

代替

if (operation = '+' || operation = '-' || operation = '*' || operation = '/' || operation = '%')

应该有

if (operation == '+' || operation == '-' || operation == '*' || operation == '/' || operation == '%')

您可以更简单地编写 if 语句。例如

const char *Operations = "+-*/%";

char *p = strchr( Operations, operation );

if ( p !=  NULL )
{
        printf("Enter the first operand:\t\t");
        getchar();
        scanf("%d", &num1);
        printf("Enter the second operand:\t\t");
        getchar();
        scanf("%d", &num2);
}

甚至不声明指针p

const char *Operations = "+-*/%";

if ( strchr( Operations, operation ) !=  NULL )
{
        printf("Enter the first operand:\t\t");
        getchar();
        scanf("%d", &num1);
        printf("Enter the second operand:\t\t");
        getchar();
        scanf("%d", &num2);
}

【讨论】:

  • 我认为对于还不知道=== 之间区别的人来说,这可能有点复杂。
【解决方案2】:

您需要使用双等号 (==),而不是单等号 (=):

if (operation == '+' || operation == '-' || operation == '*' //...

等号 (=) 仅用于赋值,因此在您尝试比较值时不起作用。

【讨论】:

    【解决方案3】:

    如前所述,您必须使用等号运算符 (==) 而不是赋值运算符 (=)。发生的情况如下:编译器尝试进行如下所示的赋值

    var = (x || y) = var
    

    因此它尝试将 var 的值分配给布尔表达式(即(x || y)),这会激怒编译器。这就是它在最后一个赋值 (%) 上工作的原因,因为编译器知道该做什么:将 '%' 分配给操作。这仍然无法按您的预期工作,但至少可以编译。实际上,您可以在 if 语句中进行赋值。所发生的情况是,将评估分配的变量(即操作)的值,如果值为 != 0,则语句为 true,否则为 false。

    【讨论】:

    • 您可以分配逻辑运算符的输出:var = 1==1 将设置 var 等于 true。
    • 你是对的,我更正了我的答案。我想我现在已经描述了编译器错误的实际原因。
    • var = x || y 分组为var = (x || y)
    • 对,然后继续: var = (x || y) = var... 这意味着他正在尝试将 var 分配给 (x || y)
    猜你喜欢
    • 2021-09-17
    • 2014-12-15
    • 2014-12-20
    • 2015-09-19
    • 2016-05-09
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多