Как поменять переменные местами?
Старая добрая задачка. Как поменять значения двух переменных местами? Первый вариант очевиден. Вводится третья переменная. Обмен происходит через нее. Пример для... Не представляю для кого.
int a = 1; int b = 2; int c = 0; c = a; a = b; b = c;
Пример не такой глупый, как кажется, потому что можно оценить затраты. Если в переменную с большей разрядностью пытаться записать значение переменной с меньшей разрядностью, нет проблем. Если наоборот, нужны меры. Можно обрезать результат, можно остановить выполнение и сигнализировать, можно увеличить разрядность. Пустим на нашу кухню третью переменную и все усугубится.
Менее очевидно, как провернуть такую же махинацию без использования третьей переменной. Сделать это можно, например, так.
a = a + b; b = a - b; a = a - b;
Или с помощью менее затратных побитовых операций.
a = a ^ b; b = a ^ b; a = a ^ b;
Для чего это может вообще понадобится? Буфер — это ведь просто и понятно. Могу предложить вашему вниманию две причины это знать. Неплохо для разминки мозга. Это первая. Можно представить, что у вас доступно мало памяти, но нет проблем с производительностью. Это вторая.
Добавлю, что использование стэка может быть эффективно. По сути — тот же буфер. Только, скорее всего, эффективно используется на уровне архитектуры. Впрочем, есть подозрение, что оптимизирующий компилятор приведет первую конструкцию к обмену через стэк, но, понятно, не сможет вторую и третью. Он оптимизирующий, а не ясновидящий.
Если вы собираетесь использовать ассемблерную вставку при программировании на C, есть свои сложности. Вместо того, чтобы помещать в стэк непосредственно значения переменных, думаю, будет правильнее предварительно записать их в регистры. Но когда начинаешь так вмешиваться в работу программы, ни на какую помощь от компилятора рассчитывать не приходится. А ведь некоторые вещи действительно проще обсчитывать автоматически, пусть и не обязательно это эффективно. Привет вам, управляемые языки! А вот при программировании микроконтроллеров счастье управляемых языков недоступно, зато можно проявить свой талант в полной мере, все выверев самому.
К чему это я? Даже самая простая задача требует серьезного рассмотрения, четкого определения исходных данных и целей.
Ваш комментарий