2012-10-05 158 views
17

我有这样的下面的代码:表达必须修改的左值

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

但它给出了一个错误说:

Error: expression must be a modifiable value

上说:“如果”行。我不想在这里修改“匹配”或“K”值,但为什么会出现这个错误?如果我只写如下:

if (match == 0) 

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

+7

您的意思是'k == M'? –

+1

'K == M' not'K = M' – Shashwat

+3

很幸运,由于'&&'和'='的运算符优先级而导致编译器错误,而不是静默地产生错误的程序! – Rufflewind

回答

29

赋值操作符比&&优先级高,所以你的条件等价于:

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

但左侧这是一个右值,即由­表达式match == 0 && k的评估得出的布尔值,因此您无法对其赋值。

相比之下,比较有更高的优先级,所以match == 0 && k == m相当于:

if ((match == 0) && (k == m)) 
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) 
          ^

和3.1锵也告诉你ederman.cc:9:30: error: expression is not assignable

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

2

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

9

在C语言中,你也会遇到同样的错误,如果你声明:

char array[size]; 

,比尝试在没有指定索引位置的情况下分配一个值:

array = '\0'; 

在做:

array[index] = '0\'; 

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

相关问题