我有以下代码:
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”行上。我不是想在这里修改“匹配”或“k”值,但为什么会出现这个错误?如果我只写它:
if ( match == 0 )
没关系。有人可以向我解释一下吗?
答案 0 :(得分:31)
赋值运算符的优先级低于&&
,因此您的条件等同于:
if ((match == 0 && k) = m)
但是左边是rvalue,即子表达式match == 0 && k
的评估产生的布尔值,因此你无法分配它。
相比之下,比较具有更高的优先级,因此match == 0 && k == m
等同于:
if ((match == 0) && (k == m))
答案 1 :(得分:15)
在C中,如果声明:
,您也会遇到同样的错误char array[size];
并尝试在不指定索引位置的情况下分配值:
array = '\0';
通过做:
array[index] = '0\';
您正在指定先前声明的可访问/可修改地址。
答案 2 :(得分:3)
请记住,单个=
始终是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
因此,请使用最新版本的免费编译器,并在使用时启用所有警告。
答案 3 :(得分:3)
您测试k = M
而不是k == M
也许这就是你想要做的,在这种情况下,写下if (match == 0 && (k = M))