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

问题描述 投票:0回答:5

我有以下代码:

int M = 3; 
int C = 5; 
int match = 3;
for ( int k =0; k < C; k ++ )
{
    match --; 
    if ( match == 0 && k = M )
    {
         std::cout << " equals" << std::endl;
    }
}

但是它给出了一个错误:

错误:表达式必须是可修改的值

在“if”行上。我不想在这里修改“match”或“k”值,但为什么会出现这个错误?如果我只写这样:

if ( match == 0 )

没关系。有人可以向我解释一下吗?

c++ if-statement
5个回答
75
投票

赋值运算符的优先级低于

&&
,因此您的条件相当于:

if ((match == 0 && k) = m)

但是它的左侧是一个右值,即由子表达式

match == 0 && k
计算得出的布尔值,因此您不能分配给它。

相比之下,比较具有更高的优先级,因此

match == 0 && k == m
相当于:

if ((match == 0) && (k == m))

62
投票

在C中,如果你声明一个:

你也会遇到同样的错误
char array[size];

然后尝试在不指定索引位置的情况下分配值:

array = '\0'; 

通过这样做:

array[index] = '0\';

您正在指定之前声明的可访问/可修改的地址。


7
投票

您测试的是

k = M
而不是
k == M

也许这就是你想做的,在这种情况下,写
if (match == 0 && (k = M))


4
投票

请记住,单个

=
始终是 C 或 C++ 中的赋值。

您的测试应该是

if ( match == 0 && k == M )
您在
k == M
测试中犯了拼写错误。

如果你真的想说

k=M
(即测试中的副作用分配),出于可读性原因,你应该编写代码
if (match == 0 && (k=m) != 0)
,但大多数编码规则建议不要这样写。

顺便说一句,您的错误建议询问所有警告(例如

-Wall
选项到
g++
),并升级到最新的编译器。下一个 GCC 4.8 会给你:

 % g++-trunk -Wall -c ederman.cc
 ederman.cc: In function ‘void foo()’:
 ederman.cc:9:30: error: lvalue required as left operand of assignment
          if ( match == 0 && k = M )
                               ^

Clang 3.1 也告诉你

ederman.cc:9:30: error: expression is not assignable

因此,请使用最新版本的免费编译器,并在使用它们时启用所有警告。


0
投票

对于 C 编程,如果你尝试将字符串分配给 char 数组,你会遇到同样的错误。

char str[10];
str = "hello";  // error: expression must be a modifiable lvalue

正确的做法是:

strcpy(str, "hello");
© www.soinside.com 2019 - 2024. All rights reserved.