2014-12-15 17 views
8

Tôi vừa biết rằng kết quả của toán tử tăng thêm tiền tố trong C++ là một giá trị lvalue. Có thể có trường hợp hành vi này giúp lập trình viên hiệu quả hơn, nhưng tôi không thể nghĩ ra được. Một số cách sử dụng thành ngữ của hành vi này của toán tử tăng thêm tiền tố là gì?Sử dụng thực tế thực tế là toán tử tăng thêm tiền tố C++ trả về một giá trị

+0

Bạn có thể vui lòng phức tạp hơn ... như trong bối cảnh bạn đang đo lường hiệu quả. – ravi

+0

Xem thêm: http://stackoverflow.com/a/371669/567292 – ecatmur

+0

Cảm ơn bạn. Tôi đã bỏ lỡ bài viết đó trong nghiên cứu của tôi trước khi đăng câu hỏi. Bởi hiệu quả tôi có nghĩa là mã súc tích và rõ ràng sẽ không được như vậy có tính năng không có mặt trong ngôn ngữ. – AlwaysLearning

Trả lời

0
i=9; 
j=10; 
k = ((i)>(j))?(j):(++i); 

Trong trường hợp trên chúng tôi có sử dụng toán tử tăng thêm tiền tố như bạn có thể c trước tiên, hãy kiểm tra i> j sẽ sai trong trường hợp này, chúng tôi sẽ gán giá trị ++ đến k chúng tôi k = 1. Ở đây trong một câu lệnh đơn, chúng tôi đã sử dụng i hai lần nhưng khi giá trị là 9 và lần khác giá trị là 10. Nếu bạn cố gắng đạt được điều này mà không có toán tử tăng thêm tiền tố, chúng tôi sẽ phải sử dụng một biến tạm thời khác để lưu trữ giá trị tôi sau đó tăng i để gán cho k. Nếu không sử dụng tiền tố hành

i=9; 
j=10; 
Temp=i; 
i=i+1; 
k = ((Temp)>(j))?(j):(i); 

Tuy nhiên nếu chúng ta đi đến một nơi conditin temp là greter hơn j thì chúng ta sẽ có giá trị của i tăng lên thậm chí nếu chúng tôi không sử dụng nó. Sử dụng toán tử prefix giá trị tje của i sẽ chỉ tăng nếu i nhỏ hơn j.

+1

OP hỏi về việc sử dụng ++ i như một giá trị. Mã đầu tiên của bạn chỉ là tốt trong C, trong đó ++ i là _not_ một giá trị. – gnasher729

4

Thay đổi từ C trong đó ++ x là một rvalue thành C++ trong đó ++ x cho các kiểu dựng sẵn là một lvalue có lẽ vì có nhiều ứng dụng hữu ích hơn. Ví dụ: bạn có thể xác định hàm theo cách khác là

void f (int x); 
void f (int& x); 

và thực tế là ++ x là một lvalue cho phép bạn gọi f (++ x); Trong cả hai trường hợp. Trong C, chỉ có trường hợp đầu tiên là hợp pháp, và hoạt động tốt với một rvalue. Trong C++, bạn muốn có một giá trị.

+0

Tôi nghĩ rằng một trường hợp với 'int f (int x);' và 'int & f (int & x);' sẽ là một chút rõ ràng hơn của một ví dụ. Bằng cách trả về một lvalue khi đưa ra một lvalue, lvalue của đối số được lưu giữ thông qua Vì vậy, nó sẽ là đáng ngạc nhiên nếu cho ăn '++ x' với hàm đột nhiên được gọi là phiên bản rvalue của hàm thay thế. –

+1

Ví dụ rõ ràng nhất sẽ là' int const & f (int const &) 'và' int & f (int & ')'. Nhưng điều này dẫn đến 'f (i + +)' gọi hàm thứ nhất, và 'f (++ i)', thứ hai là một đối số cho tiền tố _not_ '++ 'một giá trị. –

6

Lý do tiền tố ++ trả về một giá trị là trực giao; Tôi đã không thấy bất kỳ việc sử dụng nào cho nó sẽ không đủ điều kiện như là sự xáo trộn. Nhưng câu hỏi là: những quy tắc nào áp dụng để khiến biểu thức trở thành một giá trị. Trong C, quy tắc cơ bản là biểu thức mà sửa đổi một trong toán hạng của họ không lvalues, nhưng một số người muốn ủng hộ những thứ như:

T& 
someFunction(T& lhs, T const& rhs) 
{ 
    // ... 
    return lhs = rhs; 
} 

này làm việc cho người sử dụng xác định các loại (vì operator= sẽ là một thành viên chức năng) và một số thành viên muốn hỗ trợ nó cho các loại được tích hợp là . Vì vậy, quy tắc cơ bản trở thành: nếu một toán tử yêu cầu toán hạnglvalue, mà nó đã sửa đổi, kết quả của toán tử là toán hạng đã thay đổi, thì đó là một giá trị. (Như vậy, trong khi tiền tố ++ là một giá trị trái , postfix không phải là, bởi vì kết quả của biểu thức không phải là thay đổi toán hạng.)

Cá nhân, tôi không chắc là tôi đồng ý. Tôi không có vấn đề gì với việc thay thế số ở trên bằng:

T& 
someFunction(T& lhs, T const& rhs) 
{ 
    // ... 
    lhs = rhs; 
    return lhs; 
} 

đó là cách tôi viết mã của riêng mình.Nhưng với ví dụ đầu tiên là hợp pháp đối với các loại do người dùng xác định (trong đó operator= trả về a T&) và một số thành viên ủy ban đã thích nó, có vẻ như hợp lý để mở rộng các loại được tạo sẵn và kết quả là quy tắc là mạch lạc, ngay cả khi không ai thực sự có dịp sử dụng kết quả của tiền tố ++ làm giá trị.

EDIT:

Chỉ cần để làm cho nó rõ ràng: Tôi hỏi câu hỏi này rất tại một trong những cuộc họp (khi chúng tôi đã xác định C++ 98), và đây là câu trả lời tôi (từ, nếu tôi nhớ một cách chính xác, Andy Koenig, người đã làm việc với Stroustrup về những triển khai sớm nhất của C++). Đó cũng là lý do cho việc triển khai mặc định của operator= trả lại T& thay vì T const&.

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