2011-01-26 18 views
26

Trong C++, toán tử gia tăng trước cho giá trị lennyue vì chính đối tượng tăng lên được trả về, không phải là bản sao. Nhưng trong C, nó cho rvalue. Tại sao?Tại sao toán tử gia tăng cho giá trị gia tăng trong C?

+1

Câu hỏi tuyệt vời của IMHO :-) –

+0

http://stackoverflow.com/questions/371503/why-is-i-considered-an-l-value-but-i-is-not –

+1

@Jason: That câu hỏi là C++ cụ thể –

Trả lời

15

C không có tài liệu tham khảo. Trong C++ ++i trả về một tham chiếu đến i (lvalue) trong khi trong C nó trả về một bản sao (tăng dần).

C99 6.5.3.1/2

Giá trị của toán hạng của fi x ++ hành trước được tăng lên. Kết quả là giá trị mới của toán hạng sau khi tăng thêm. Biểu thứC++ Eis tương đương với (E + = 1).

‘‘value of an expression’’ <=> rvalue

Tuy nhiên vì những lý do lịch sử Tôi nghĩ rằng "tài liệu tham khảo không phải là một phần của C" có thể là một lý do tốt.

+0

Nhưng tôi vẫn không thể hiểu lý do tại sao nó trả về một bản sao trước khi gia tăng. Tại sao chỉ không trả lại tăng i như nó nói, i = j. Ở đây, bản gốc i, sau khi được thay đổi, được trả lại. Tương tự, trong i = i + 1, i, chính nó có thể được trả lại sau khi được thay đổi. –

+1

@HappyMittal: Biểu thức không thực sự trả về giá trị, chúng có giá trị (hoặc đánh giá giá trị) và các thuộc tính khác như type và _lvalue-ness_, biểu thức '++ i' không" trả về "một bản sao, ở đó không có bản sao. '++ i' đánh giá giá trị mới của' i'. Không có bản sao trừ khi bạn sử dụng nó trong một biểu thức lớn hơn tạo một bản sao. –

+0

@Charles Bailey: Ok, tôi đồng ý rằng trong ++ tôi đánh giá giá trị mới của i. Nhưng câu hỏi của tôi là trong i = j, tôi được thay đổi và biểu thức mang lại một giá trị. Vì vậy, ví dụ: i = i + 1 là khá giống với i = j, thì tại sao trong trường hợp này, biểu thức không mang lại giá trị lvalue? –

2

Tắt đầu của tôi, tôi không thể tưởng tượng bất kỳ câu lệnh hữu ích nào có thể phát sinh từ việc sử dụng biến được tăng trước làm giá trị. Trong C++, do sự tồn tại của quá tải toán tử, tôi có thể. Bạn có một ví dụ cụ thể về điều gì đó mà bạn bị ngăn cản thực hiện trong C, do hạn chế này?

+2

Đây phải là nhận xét. –

+0

@ Jason..yes. Tôi không thể làm điều này trong C - int * ptr = & ++ i –

+1

@Filip Đó là câu trả lời của tôi (được thừa nhận không nghiêm ngặt) cho câu hỏi được đặt ra. Việc bổ sung các toán tử quá tải trong C++ đã làm cho giá trị gia tăng trước khi tăng giá trị, do đó nó được thêm vào. –

2

C99 nói trong chú thích (của phần $ 6.3.2.1),

Tên '' giá trị trái '' có nguồn gốc ban đầu từ biểu thức phân E1 = E2 , trong đó các toán hạng E1 trái là yêu cầu phải là một giá trị (có thể thay đổi). Có lẽ tốt hơn được coi là đại diện cho một đối tượng '' định vị giá trị ''. Đôi khi được gọi là ‘‘ rvalue ’’ nằm trong tiêu chuẩn quốc tế được mô tả là ‘giá trị là một biểu thức’ ’.

Hy vọng giải thích tại sao ++i trong C, trả về giá trị.


Đối với C++, tôi sẽ nói tùy thuộc vào đối tượng đang được tăng lên. Nếu kiểu của đối tượng là một số loại do người dùng định nghĩa thì nó luôn có thể trả về giá trị. Điều đó có nghĩa, bạn luôn có thể viết i++++++++ hoặc ++++++i nếu loại iIndex như đã định nghĩa ở đây:

Undefined behavior and sequence points reloaded

+0

Nếu loại của đối tượng là _not_ một kiểu do người dùng định nghĩa thì tiền gia tăng phải là _lvalue_. –

+0

Tôi hỏi về hành vi trong C vì trong C++, nó có ý nghĩa để trả về lvalue như đối tượng tăng dần sẽ được trả về. –

+1

@Charles: hehe .. yeah. Vì OP không đề cập đến loại đối tượng, tôi chỉ trả lời một mặt của câu hỏi. – Nawaz