Xor-swap использует назначения. Но, возможно, вам разрешено использовать инкремент и декремент (которые, строго говоря, разрешаются до += 1
и -= 1
в C #, но логически они часто считаются разными).
int tmp = 0; // C# complains if we don’t initialize!
while (a-- > 0)
tmp++;
while (b-- > 0)
a++;
while (tmp-- > 0)
b++;
Эта логика иногда используется при анализе примитивных исчислений, таких как формализм программы LOOP. Конечно, эти формализмы не требуют инициализации полей, в противном случае все правило «без присвоения» будет полностью спорным. В строгом исчислении tmp
также должно быть инициализировано нулем с помощью цикла:
while (tmp > 0)
tmp--;
Это будет работать независимо от того, какое значение tmp
имело ранее (при условии tmp > 0
, что обычно является требованием во всех этих исчислениях: отрицательных чисел не существует).
Но, чтобы подчеркнуть это еще раз, C # требует нас для инициализации каждой локальной переменной (нелокальные переменные инициализируются по умолчанию), так что этот цикл будет избыточным в C #, и инициализация по-прежнему требуется .
Как отметил @Doc Brown в комментариях, это работает только для (положительных!) Целых чисел - хотя теоретически (еще раз: не в C #!) Это можно сделать для работы с любым типом, который может быть представлен на Von Архитектура Неймана, поскольку все они хранятся в памяти как числа (до некоторой базы).