C++ 表达式必须是可修改的左值
我有以下代码:C++ 表达式必须是可修改的左值,c++,if-statement,C++,If Statement,我有以下代码: 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; } } 没关系。有人能给我解释一下吗
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;
}
}
没关系。有人能给我解释一下吗请记住,一个单一的<代码>=<代码>总是C或C++中的一个赋值。 如果(match==0&&k==M)您在
k==M
测试中输入了错误,您的测试应该是
如果你真的是指k=M
(即测试中影响赋值的副作用),出于可读性的原因,你应该选择codeIf(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 )
^
Clang3.1还告诉您ederman.cc:9:30:error:expression是不可赋值的
因此,请使用最新版本的免费编译器,并在使用它们时启用所有警告。您测试的是k=M
,而不是k==M
也许这就是您想要做的,在这种情况下,如果(match==0&&(k=M))
赋值运算符的优先级低于&&
,那么您的条件等价于:
if ((match == 0 && k) = m)
if ((match == 0) && (k == m))
但它的左边是一个右值,即对子表达式match==0&&k
求值后得到的布尔值,因此不能对其赋值
相比之下,比较具有更高的优先级,因此match==0&&k==m
相当于:
if ((match == 0 && k) = m)
if ((match == 0) && (k == m))
在C语言中,如果您声明一个:
char array[size];
然后尝试在不指定索引位置的情况下分配值:
array = '\0';
通过这样做:
array[index] = '0\';
您正在指定先前声明的可访问/可修改地址。您的意思是
k==M
?幸运的是,由于&&
和=
的运算符先例,它导致了编译器错误,而不是默默地生成错误的程序!如果条件中的赋值产生了一些影响,您能列出一些用例吗sense@KunalMukherjee嗯,从来没有?@TMOTTM可能会引起一些额外的副作用