Подкачайте две переменные, не используя временную переменную

Пожалуйста, рассмотрите возможность использования плагина ACF.

И вы могли бы достичь этого, создав поле повторов и установив и обновив эти поля таким образом

$array_of_parts = get_fied('your-field-name', $post->ID);

Или

$array_of_parts[] = 'your-new-part';
update_field('your-field-name', $array_of_parts, $post->ID);

, тогда вы могли бы итерируйте эти части с помощью foreach и получайте количество частей, вызывая

count( $array_of_parts )

или используйте цикл

for($i=1;$i<=1000;$i++){
    $file = get_post_meta($post->ID, $i, true);
    if(!empty($file)){
        echo $file;
    }else{
        break;
    }
}
63
задан Peter Mortensen 16 September 2016 в 03:33
поделиться

9 ответов

Прежде всего, замена без временной переменной в языке поскольку C # - очень плохая идея .

Но для ответа вы можете использовать этот код:

startAngle = startAngle + stopAngle;
stopAngle = startAngle - stopAngle;
startAngle = startAngle - stopAngle;

Однако могут возникнуть проблемы с округлением, если два числа существенно различаются. Это связано с природой чисел с плавающей точкой.

Если вы хотите скрыть временную переменную, вы можете использовать служебный метод:

public static class Foo {

    public static void Swap<T> (ref T lhs, ref T rhs) {
        T temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}
111
ответ дан 24 November 2019 в 16:01
поделиться

Правильный способ поменять местами две переменные:

decimal tempDecimal = startAngle;
startAngle = stopAngle;
stopAngle = tempDecimal;

Другими словами, используйте временную переменную.

Там у вас есть. Никаких хитрых трюков, никаких сопровождающих вашего кода, проклинающих вас на протяжении десятилетий, никаких записей в Daily WTF , и не тратите слишком много времени, пытаясь выяснить, зачем вам это нужно в одной операции, так как самый низкий уровень, даже самая сложная языковая функция - это серия простых операций.

Просто очень простой, читаемый, легкий для понимания, t = a; а = б; b = t; решение.

По моему мнению, разработчики, которые пытаются использовать трюки, например, для «подмены переменных без использования temp» или «устройства Даффа», просто пытаются показать, насколько они умны ( и с треском провалился).

Я сравниваю их с теми, кто читает высокоуровневые книги исключительно для того, чтобы казаться более интересными на вечеринках (в отличие от расширения вашего горизонта).

Решения, в которых вы добавляете и вычитаете, или решения на основе XOR, меньше удобочитаемое и, скорее всего, медленнее, чем простое решение «временная переменная» (арифметические / логические операции вместо простых перемещений на уровне сборки).

Сделайте себе и другим услугу, написав читаемый код хорошего качества.

Это моя напыщенная речь. Спасибо за то, что выслушали: -)

Кстати, я прекрасно понимаю, что это не отвечает на ваш конкретный вопрос (и я извинюсь за это), но есть много прецедентов на SO, когда люди спрашивают, как сделать что-то и правильный ответ: «Не делай этого».

Решения, в которых вы добавляете и вычитаете, или решения на основе XOR, менее читабельны и, скорее всего, медленнее, чем простое решение «временная переменная» (арифметические / логические операции вместо простых перемещений на уровне сборки). [1248 Сделайте себе и другим услугу, написав качественный читаемый код.

Это моя напыщенная речь. Спасибо за то, что выслушали: -)

Кстати, я прекрасно понимаю, что это не отвечает на ваш конкретный вопрос (и я извинюсь за это), но есть много прецедентов на SO, когда люди спрашивают, как сделать что-то и правильный ответ: «Не делай этого».

Решения, в которых вы добавляете и вычитаете, или решения на основе XOR, менее читабельны и, скорее всего, медленнее, чем простое решение «временная переменная» (арифметические / логические операции вместо простых перемещений на уровне сборки). [1248 Сделайте себе и другим услугу, написав качественный читаемый код.

Это моя напыщенная речь. Спасибо за то, что выслушали: -)

Кстати, я прекрасно понимаю, что это не отвечает на ваш конкретный вопрос (и я извинюсь за это), но есть много прецедентов на SO, когда люди спрашивают, как сделать что-то и правильный ответ: «Не делай этого».

сервис, написав качественный читаемый код.

Это моя напыщенная речь. Спасибо за то, что выслушали: -)

Кстати, я прекрасно понимаю, что это не отвечает на ваш конкретный вопрос (и я извинюсь за это), но есть много прецедентов на SO, когда люди спрашивают, как сделать что-то и правильный ответ: «Не делай этого».

сервис, написав качественный читаемый код.

Это моя напыщенная речь. Спасибо за то, что выслушали: -)

Кстати, я прекрасно понимаю, что это не отвечает на ваш конкретный вопрос (и я извинюсь за это), но есть много прецедентов на SO, когда люди спрашивают, как сделать что-то и правильный ответ: «Не делай этого».

217
ответ дан 24 November 2019 в 16:01
поделиться

Не в C #. В нативном коде вы можете использовать трюк с тройной заменой XOR, но не на языке высокого уровня, обеспечивающем безопасность типов. (Во всяком случае, я слышал, что трюк XOR в действительности оказывается медленнее, чем использование временной переменной во многих распространенных архитектурах ЦП.)

Вам следует просто использовать временную переменную. Там нет причин, вы не можете использовать один; это не значит, что предложение ограничено.

11
ответ дан 24 November 2019 в 16:01
поделиться

Да, используйте этот код:

stopAngle = Convert.ToDecimal(159.9);
startAngle = Convert.ToDecimal(355.87);

Проблема сложнее для произвольных значений. : -)

72
ответ дан 24 November 2019 в 16:01
поделиться
int a = 4, b = 6;
a ^= b ^= a ^= b;

Работает для всех типов, включая строки и поплавки.

43
ответ дан 24 November 2019 в 16:01
поделиться

Для полноты, вот двоичный обмен XOR:

int x = 42;
int y = 51236;
x ^= y;
y ^= x;
x ^= y;

Это работает для всех атомарных объектов / ссылок, так как оно имеет дело непосредственно с байтами, но может потребовать небезопасного контекста для работать над десятичными знаками или, если вы чувствуете себя действительно извращенными, указатели. И это может быть медленнее, чем временная переменная, а также в некоторых обстоятельствах.

6
ответ дан 24 November 2019 в 16:02
поделиться

Для двоичных типов вы можете использовать этот прикол:

a %= b %= a %= b;

Пока a и b не являются одной и той же переменной (например, псевдонимами для одной и той же памяти), она работает.

2
ответ дан 24 November 2019 в 16:02
поделиться

<не рекомендуется>

Вы можете сделать это в 3 строки, используя базовую математику - в моем примере я использовал умножение, но также работало бы простое сложение.

float startAngle = 159.9F;
float stopAngle = 355.87F;

startAngle = startAngle * stopAngle;
stopAngle = startAngle / stopAngle;
startAngle = startAngle / stopAngle;

Редактировать: Как отмечено в комментарии, это не будет работать, если у = 0, поскольку это приведет к ошибке деления на ноль, которую я не рассматривал. Таким образом, альтернативное решение +/- было бы наилучшим способом.


Чтобы мой код был сразу понятным, я бы с большей вероятностью сделал что-то подобное. [Всегда думайте о бедняге, которому придется поддерживать ваш код]:

static bool Swap<T>(ref T x, ref T y)
{
    try
    {
        T t = y;
        y = x;
        x = t;
        return true;
    }
    catch
    {
        return false;
    }
}

И тогда вы можете сделать это в одной строке кода:

float startAngle = 159.9F
float stopAngle = 355.87F
Swap<float>(ref startAngle, ref stopAngle);

Или ...

MyObject obj1 = new MyObject("object1");
MyObject obj2 = new MyObject("object2");
Swap<MyObject>(ref obj1, ref obj2);

Готово как ужин ... теперь вы можете передавать объекты любого типа и переключать их вокруг ...

7
ответ дан 24 November 2019 в 16:02
поделиться
a = a + b
b = a - b
a = a - b

َ

3
ответ дан 24 November 2019 в 16:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: