2012-03-01 19 views
14

Tôi có đoạn code sau đây viết bằng cả C++ và C#++ i chênh lệch điều hành trong C# và C++

int i=0; 
++i = 11; 

Sau khi biên dịch C# này mang lại một lỗi

The left-hand side of an assignment must be a variable, property or indexer 

Nhưng C++ biên dịch tạo ra mã này không có lỗi và tôi nhận được kết quả 11 với giá trị là i. Lý do của sự khác biệt này là gì?

+4

offtopic: tại sao bạn muốn tăng nó và sau đó trực tiếp đặt nó thành 11? Sự gia tăng không có ý nghĩa. – RvdK

+0

Việc sử dụng mã này là gì? –

+0

'someArray [++ i] = 11' sẽ có ý nghĩa hơn. –

Trả lời

41

Sự khác biệt là toán tử tăng trước là lvalue bằng C++ và không nằm trong C#.
Trong C++ ++i trả về tham chiếu đến biến tăng dần. Trong C# ++i trả về giá trị gia tăng của biến i.
Vì vậy, trong trường hợp này ++ilvalue bằng C++ và rvalue trong C#.

Từ C++ đặc điểm kỹ thuật về tăng tiền tố hành

Các loại toán hạng sẽ là một loại số học hoặc một con trỏ đến một loại đối tượng hoàn toàn xác định. Giá trị là giá trị mới của toán hạng ; nó là lvalue.

P.S. toán tử tăng thêm postfix i ++ không phải là lvalue trong cả C# và C++, do đó, dòng mã này sẽ mang lỗi ở cả hai ngôn ngữ.

int i=0; 
i++ = 11; 
5

C# và C++ là 2 ngôn ngữ và khái niệm hoàn toàn khác nhau. Họ chỉ chia sẻ tên bởi vì cú pháp của họ dựa trên C. Vì vậy, thực sự "tại sao điều này làm việc trên C# nhưng không phải trên C + +" làm cho không có ý nghĩa như là một câu hỏi. Nó cũng giống như nói tại sao một bảng được gọi là "bảng" bằng tiếng Anh, nhưng "mesa" bằng tiếng Tây Ban Nha. Bởi vì nó đã được quyết định theo cách đó.

C# chỉ đơn giản là không cho phép cú pháp như vậy.

Trong C++ bạn được phép: đầu tiên ++i được tính, làm cho i = 1 và sau đó được gán cho i, làm cho i = 11.

+3

Đó là một chút khắc nghiệt. Câu hỏi * là * phổ biến đối với ngôn ngữ C và nhiều thứ hoạt động trong C++ cũng hoạt động trong C#! Đó là một câu hỏi hoàn toàn hợp lệ IMO, đặc biệt là kể từ trong C++ mã trong câu hỏi đại diện cho một tuyên bố mà không có ý nghĩa hợp lý. – adelphus

+0

Harsh? Tại sao khắc nghiệt? Tôi chỉ nói rằng C# và C++ không có điểm chung ngoại trừ việc dựa trên C. Câu hỏi không phổ biến với C, bởi vì anh ta không hỏi về C, và trong C câu đó hoạt động hoàn hảo, và nó không có trong C#, chỉ chứng minh C# không có gì để làm với C ngoại trừ tên và cú pháp (mà btw được sao chép bởi rất nhiều ngôn ngữ như Perl, Java và như vậy). – m0skit0

+2

C# và C++ có điểm tương đồng ... Không khác với ví dụ Java và Haskell. Vì vậy, đối với tôi đó là một câu hỏi hợp lệ và nó là thú vị cho tôi để biết. –

2

ngữ nghĩa rất khác nhau. Trong c + + ngữ nghĩa là bạn gán giá trị 11 cho vị trí lưu trữ được xác định bởi i. Trong C# ngữ nghĩa là bằng với ngữ nghĩa của báo cáo kết quả dưới đây

1=11 

Đó là nó tương đương với cố gắng để gán giá trị 11 với giá trị 1 mà biên dịch C# không cho phép. (Các trình biên dịch Fortran thực sự cho phép điều này và có thể tạo ra các kịch bản gỡ lỗi địa ngục)

6

Lưu ý rằng ++i = 11 gọi undefined trong C++ 03 vì bạn đang sửa đổi i hai lần mà không có điểm chuỗi can thiệp. Nó cũng được định nghĩa trong C++ 11, tuy nhiên: đầu tiên là increment, sau đó là assignment.