Nó ngụ ý của câu trả lời khác, và tôi ủng hộ đề nghị từ C++ để điều trị này là "một điều xấu để làm", nhưng "đơn giản" sửa chữa là:
int x = 0;
x = Increment(ref x) + x;
Bởi vì C# đảm bảo trái sang phải đánh giá các biểu thức *, điều này làm những gì bạn mong đợi.
* phần Trích dẫn "7.3 Các nhà khai thác" của C# Spec:
Phép toán trong một biểu thức được đánh giá từ trái sang phải. Ví dụ, trong F(i) + G(i++) * H(i)
, phương thức F
được gọi là sử dụng giá trị cũ i
, sau đó phương thức G
được gọi với giá trị cũ là i
và cuối cùng, phương thức H
được gọi với giá trị mới i
. Điều này tách biệt và không liên quan đến quyền ưu tiên của nhà điều hành.
Lưu ý rằng câu cuối cùng nghĩa này:
int i=0, j=0;
Console.WriteLine(++j * (++j + ++j) != (++i + ++i) * ++i);
i = 0; j = 0;
Console.WriteLine($"{++j * (++j + ++j)} != {(++i + ++i) * ++i}");
i = 0; j = 0;
Console.WriteLine($"{++j} * ({++j} + {++j}) != ({++i} + {++i}) * {++i}");
đầu ra này:!
Đúng
5 = 9
1 * (2 + 3) = (1 + 2) * 3
và dòng cuối cùng có thể là "tr usted "là các giá trị giống như được sử dụng trong hai biểu thức trước. I E. mặc dù việc bổ sung được thực hiện trước phép nhân, vì các dấu ngoặc đơn, các toán hạng đã được đánh giá.
Lưu ý rằng "refactoring" này để:
i = 0; j = 0;
Console.WriteLine(++j * TwoIncSum(ref j) != TwoIncSum(ref i) * ++i);
i = 0; j = 0;
Console.WriteLine($"{++j * TwoIncSum(ref j)} != { TwoIncSum(ref i) * ++i}");
i = 0; j = 0;
Console.WriteLine($"{++j} * {TwoIncSum(ref j)} != {TwoIncSum(ref i)} * {++i}");
private int TwoIncSum(ref int parameter)
{
return ++parameter + ++parameter;
}
vẫn hoạt động hoàn toàn giống nhau:
Đúng
5 = 9
1 * 5 = 3 * 3
!
Nhưng tôi vẫn muốn không dựa vào nó :-)
Bạn chính xác đang cố gắng làm gì? Và ý bạn là gì bởi "đầu ra của mã này là 1"? –
@Bartdude, x là 1 sau '+ ='. –
Vì vậy, bạn đang cố gắng tăng x x 2? Mục tiêu là gì? – alan