отжог...
#include <stdio.h> //c++
int main(void)
{
int i;
i = 5;
i = ++i + ++i;
printf("%d\n",i);
return 0;
} // i=14
using System; //c#
class Program
{
static void Main()
{
int i = 5;
i = ++i + ++i;
Console.WriteLine(i);
}
} // i=13
Йееее! Я и не подозревал, насколько тяжёл клинический случай C#. Попробовал разобраться, почему результаты разные, и вот к чему прихожу:
Что имеем в C1. Считаем ++i, т.е. увеличиваем на 1 содержимое (int)&i (теперь i=6);
2. Ещё раз пункт 1 (теперь i=7);
3. Складываем содержимое памяти по адресу (int)&i с самим собой. Может быть, умный компилятор превратит это в i<<1 - неважно. Порядок операндов для "+" тоже роли здесь не играет, хотя, скорее всего, справа налево. Короче, получаем i=14.
А теперь C#!1. Считаем ++i. Хрен знает, как это i интерпретируется - может, как имя, ассоциированное с областью памяти и типом (в смысле содержимого этой памяти, а не обозначения для указателя), может, как-то иначе. Но теперь важно лишь то, что i=6;
2. (рождение чуда!) Копируем это значение [в "стек"
оператора "+"?];
3. Повторяем 1. i=7;
4. (снова чудо!) Копируем это значение [в "стек"
оператора "+"?];
5. Пошёл "оператор" сложения: 7+6=13. Оп-па!
Ну вот! Операторы в C# работают как функции с передачей фактических аргументов по значению, что ли?