表达式必须是可修改的左值
Expression must be a modifiable lvalue
我有以下代码:
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
因此,请使用最新版本的免费编译器,并在使用它们时启用所有警告。
相关文章:
- 对于结构,表达式必须是可修改的ivalue
- 表达式必须是可修改的左值.科迪米
- 错误:表达式必须是可修改的 I值
- 如何修改Lambda表达式以将输出放入文本文件
- 表达式必须是可修改的左值 Errror
- 错误表达式必须是插入函数(二叉树 C++)中的可修改 Ivalue
- 表达式必须是带有枚举的可修改左值
- 表达式必须是可修改的右值C++
- 循环赋值的多维数组:表达式必须是可修改的左值
- 修改正则表达式以包含反斜杠和单引号(以便反斜杠表现为转义字符)
- C++ 时间存储time_point表达式必须是可修改的左值
- 在 lambda 表达式中自动推导出的类型是什么,用于修改 bool 类型的向量(特殊容器)
- 表达式必须是可修改的lvalue:`(x,y)= 0;`
- 将值分配给指针时:表达式必须是可修改的lvalue
- 错误:表达式必须是可修改的LVALUE
- 通过使用模板类,表达式必须是可修改的LVALUE
- 表达式必须是可修改的左值
- 表达式必须是可修改的左值(字符数组)
- boost.proto+就地修改表达式树
- 当 f & g 修改相同的全局变量时,表达式 f() 的值是否> g() 未定义或未指定?