Почему-то я уверен, что мой пост будет первым в наступающем году.
Итак, начну с того, что многие думают, что порядок разбора выражений в C# идентичен С++. На самом деле, дело тут обстоит не совсем так. Мои слушатели обратили на данный факт мое внимание. Итак пусть есть два простых фрагмента кода на C#
static void Main(string[] args)
{
int f = 1;
f +=f++;
Console.WriteLine(f);
}
а это соответствующий фрагмент на С++ (тега почему-то нет в тулбаре)
void main()
{
int f = 1;
f += f++;
cout<<f;
}
Можете проверить, что результат будет разный, и интуитивно (как для меня) прогнозируемый результат получается именно в случае С++. Весь фокус в том, что строка разбирается слева направо в C# и справа налево в С++, то есть строка в C# трансфорируется в
f = f + f++;
в тоже время переставленный операнд
f = f++ + f;
дает аналогичный результат как и в C++. Возможно, неточность в компиляторе или это тот самый случай когда от перемены мест слагаемых меняется сумма :) или это связано с особенностями ValueType когда первая переменная копируется в отдельную область памяти и там инкрементируется отдельно от своего источника.
P.S. Согласен, что данный кусок кода может представлять собой плохо написанный фрагмент, но факт остается фактом - парсинг идет разный и это стоит учитывать. Хотя желающим я могу посоветовать писать правильно f += ++f, что работает одинаково на обоих языках.
P.P.S. Да, кстати, поздравляю всех с наступившим Новым 2008-м годом !