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

Expression must be a modifiable lvalue

本文关键字:修改 表达式      更新时间:2023-10-16

我有以下代码:

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;
    }
}

但它给出了一个错误说:

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

在那个"如果"行上。我不是在尝试在这里修改"匹配"或"k"值,但为什么会出现此错误?如果我只这样写:

if ( match == 0 )

还行。有人可以向我解释一下吗?

值运算符的优先级低于 && ,因此您的条件等效于:

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

但是它的左边是一个右值,即由子表达式 match == 0 && k 求值得出的布尔值,因此您不能分配给它。

相比之下,比较具有更高的优先级,因此match == 0 && k == m等效于:

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

在 C 中,如果您声明 a,您也会遇到相同的错误:

char array[size];

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

array = ''; 

通过做:

array[index] = '0';

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

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

请记住,单个=始终是 C 或 C++ 中的赋值。

您的测试应该是您在k == M测试中输入错别字if ( match == 0 && 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

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