它是由其他的答案暗示,我贊同從C++將此視爲「不好的事情」的建議,但「簡單」的解決方法是:
int x = 0;
x = Increment(ref x) + x;
因爲C#確保了左至右表達式*的評估,這是你所期望的。
*引述部分「7.3運算符」 C#的規格的:
操作數中的表達從左至右進行評估。例如,在F(i) + G(i++) * H(i)
中,使用舊值i
調用方法F
,然後使用舊值i
調用方法G
,最後使用新值i
調用方法H
。這與運營商優先權是分開的並且與運營商優先權無關。
注意,最後一句含義:
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}");
輸出該:!
真
5 = 9
1 *(2 + 3)=(1 + 2)* 3
並且最後一行可以是「tr usted「與前面兩個表達式中使用的值相同。 I.E.即使在乘法之前執行加法,由於括號,操作數已經被評估。
需要注意的是 「重構」 這:
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;
}
仍然有效如出一轍:
真
5 = 9
1 * 5 = 3 * 3
!
但我仍然寧願不依靠它:-)
你到底在做什麼? 「這段代碼的輸出是1」是什麼意思? – 2013-04-08 14:28:34
@Bartdude,在'+ ='後面x是1。 – 2013-04-08 14:29:04
那麼你是不是想用x增加2?目標是什麼? – alan 2013-04-08 14:29:57