2012-10-05 48 views
17

tôi có mã này như sau:Biểu phải là một giá trị trái modifiable

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

Nhưng nó mang lại cho ra một lỗi nói:

Error: expression must be a modifiable value

trên rằng "nếu" dòng. Tôi không cố sửa đổi giá trị "khớp" hoặc "k" ở đây, nhưng tại sao lại là lỗi này? nếu tôi chỉ viết nó như:

if (match == 0) 

nó là ok. Ai đó có thể giải thích cho tôi?

+7

Ý của bạn là 'k == M'? –

+1

'K == M' không' K = M' – Shashwat

+3

Bạn may mắn vì nó dẫn đến lỗi trình biên dịch do tiền tố của toán tử '&&' và '=', thay vì âm thầm tạo ra một chương trình không chính xác! – Rufflewind

Trả lời

29

Toán tử gán có độ ưu tiên thấp hơn &&, vì vậy tình trạng của bạn là tương đương với:

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

Nhưng phía bên tay trái của điều này là một rvalue, cụ thể là boolean là kết quả của việc đánh giá biểu thức phụ ­ match == 0 && k, vì vậy bạn không thể gán cho nó.

Ngược lại, so sánh có độ ưu tiên cao hơn, vì vậy match == 0 && k == m tương đương với:

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

Hãy nhớ rằng một đơn = luôn là nhiệm vụ trong C hoặc C++.

Bài kiểm tra của bạn phải là if (match == 0 && k == M) bạn đã đánh máy trên bài kiểm tra k == M.

Nếu bạn thực sự có nghĩa là k=M (tức là một tác vụ phụ bên trong thử nghiệm), bạn nên vì lý do khả năng đọc mã if (match == 0 && (k=m) != 0) nhưng hầu hết các quy tắc mã đều khuyên không viết.

BTW, lỗi của bạn đề xuất yêu cầu tất cả cảnh báo (ví dụ: -Wall tùy chọn g++) và để nâng cấp lên các trình biên dịch gần đây. GCC tới 4.8 sẽ cung cấp cho bạn:

% 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) 
          ^

và Clang 3.1 cũng cho bạn biết ederman.cc:9:30: error: expression is not assignable

Vì vậy, sử dụng các phiên bản gần đây của trình biên dịch miễn phí và cho phép tất cả các cảnh báo khi sử dụng chúng.

2

Bạn kiểm tra k = M thay vì k == M.
Có lẽ nó là những gì bạn muốn làm, trong trường hợp này, hãy viết if (match == 0 && (k = M))

9

Trong C, bạn cũng sẽ trải nghiệm những lỗi tương tự nếu bạn khai báo một:

char array[size]; 

và hơn thử để chỉ định giá trị mà không chỉ định vị trí chỉ mục:

array = '\0'; 

Bằng cách thực hiện:

array[index] = '0\'; 

Bạn đang chỉ định địa chỉ có thể truy cập/sửa đổi được khai báo trước đó.

Các vấn đề liên quan