Когда ++ не дает такие же результаты, как +1?

Вы не можете ссылаться на сам документ в обновлении (пока). Вам нужно будет перебирать документы и обновлять каждый документ с помощью функции. См. этот ответ для примера, или этот для серверной стороны eval().

27
задан Jacob Schoen 14 September 2012 в 21:41
поделиться

14 ответов

Когда Вы используете язык, который позволяет перегрузку оператора, и '+ < integer>'; был определен, чтобы сделать что-то другое, чем пост - и префикс '++ '.

С другой стороны, я только видел такое отвращение в школьных проектах*, если Вы встречаетесь с этим в дикой природе, у Вас, вероятно, есть действительно хорошее, хорошо зарегистрированный, причина.

[* стопка целых чисел, если я не ошибаюсь. '++' и '-' продвинутый и вытолканный, в то время как '+' и '-' выполнил нормальную арифметику]

0
ответ дан Christoffer 14 September 2012 в 21:41
поделиться
  • 1
    @SteveTaylor: С другой стороны, это сделает его менее идиоматичным любому от дополнительного чтения.NET Ваш код... Я предполагаю, что это зависит от Вашей команды. – Jon Skeet 14 December 2011 в 07:09

Насколько мой опыт идет, выражение параметра оценено сначала и получает значение уровня. Сама переменная увеличена, прежде чем функция вызвана, потому что компилятор не заботится, используете ли Вы выражение в качестве параметра или иначе... Все, что это знает, - то, что это должно увеличить значение и получить старое значение как результат выражения.

Однако, по-моему, код как это действительно неаккуратен, с тех пор путем попытки быть умным, он делает, необходимо думать дважды о том, что действительно происходит.

-2
ответ дан rep_movsd 14 September 2012 в 21:41
поделиться
  • 1
    о, извините это была статья MSDN, которая смутила меня: msdn.microsoft.com/en-us/library/… это говорит "//Ожидают, если очередь занята. перед вызовом: Монитор. Ожидайте (m_smplQueue); " я читал и одновременно и запутался, о котором который. –  7 December 2011 в 19:57

Разъяснить все другие ответы:

+++++++++++++++++++++

DoStuff(a++);

эквивалентен:

DoStuff(a);
a = a + 1;

+++++++++++++++++++++

DoStuff(++a);

эквивалентен:

a = a + 1;
DoStuff(a);

+++++++++++++++++++++

DoStuff(a + 1);

эквивалентен:

b = a + 1;
DoStuff(b);

+++++++++++++++++++++

44
ответ дан Matt 14 September 2012 в 21:41
поделиться

Пока заманчиво переписать как:

DoStuff(++level);

я лично думаю, что это менее читаемо, чем постепенное увеличение переменной до вызова метода. Как отмечено несколькими ответами выше, следующее было бы более ясным:

level++;
DoStuff(level);
0
ответ дан Chris Ballard 14 September 2012 в 21:41
поделиться

возвращаемое значение level++ будет level и therefore передача level в [1 110]. Это могло быть довольно противной ошибкой, поскольку рекурсия никогда не будет заканчиваться (от того, что показывают DoStuff, всегда передается с тем же значением). Возможно ++level или level + 1 предназначен вместо этого?

level + 1 передаст level + 1 в [1 116] и отпуск level неизменный для остальной части функции.

<час>

постинкрементный оператор (переменная ++) точно эквивалентен функции

int post_increment(ref int value)
{
    int temp = value;
    value = value + 1
    return temp;
}

, в то время как преинкрементный оператор (++ переменная) точно эквивалентен функции

int pre_increment(ref int value)
{
    value = value + 1;
    return value;
}
<час>

Поэтому при расширении оператора, встроенного в код операторы эквивалентны:

DoStuff(a + 1)

int temp = a + 1;
DoStuff(temp);
<час>
DoStuff(++a)

a = a + 1;
DoStuff(a);
<час>
DoStuff(a++);

int temp = a;
a = a + 1;
DoStuff(temp);
<час>

важно отметить, что постинкремент не эквивалентен:

DoStuff(a);
a = a + 1;
<час>

Кроме того, как точка стиля, не нужно увеличивать значение, если намерение не состоит в том, чтобы использовать увеличенное значение (определенная версия правила, "не присваивают значение переменной, если Вы не планируете использование того значения"). Если значение i + 1 никогда не используется снова, то предпочтительное использование должно быть DoStuff(i + 1) а не DoStuff(++i).

12
ответ дан 10 revs 14 September 2012 в 21:41
поделиться
  • 1
    Ничего себе - да действительно, который работал замечательно! Спасибо! – Johncl 9 June 2015 в 15:42

level+1 отправляет, любой level+1 к функции. уровень ++ отправляет уровень в функцию и затем увеличивает его.

Вы могли сделать ++ уровень, и это, вероятно, даст Вам результаты, которые Вы хотите.

0
ответ дан itsmatt 14 September 2012 в 21:41
поделиться
  • 1
    That' s интересная информация. У меня есть репозиторий с 73 000 файлов (примерно 350 МБ) и it' s невероятный медленный. Я должен запросить то, что они используют. – Till 7 April 2009 в 14:02

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

второй пример использует значение 'индекса' плюс 1, но не изменяет содержание 'индекса'.

Так, в зависимости от того, что Вы желаете сделать здесь, в хранилище могли быть некоторые неожиданности!

0
ответ дан paul 14 September 2012 в 21:41
поделиться
  • 1
    It' s FSFS (по крайней мере, это теперь). В течение 1-го года или так нашего repo' s продолжительность жизни это был BDB (FSFS didn' t существуют все же). Как некоторая точка мы сделали цикл дампа/загрузки для преобразования в FSFS. Мы weren' t имеющий любые определенные проблемы с BDB, но FSFS кажется архитектурно лучше (следовательно, FSFS является теперь значением по умолчанию). – myron-semack 27 January 2009 в 00:38

На уровне ++ Вы используете постфиксный оператор. Этот оператор работы после переменной используется. Это - после того, как это помещается на стек для вызванной функции, это увеличено. С другой стороны, уровень + 1 является простым математическим выражением, и это оценено, и результат передается вызванной функции. Если Вы хотите увеличить переменную сначала и затем передать ее вызванной функции, можно использовать префиксный оператор: ++ уровень

1
ответ дан TheVillageIdiot 14 September 2012 в 21:41
поделиться
  • 1
    Подрывная деятельность использует перспективные дельты. – Ivan Zhakov 3 January 2012 в 08:11

level++ возвраты текущее значение level, затем увеличивает level. level+1 не изменяется level вообще, но DoStuff назван со значением (level + 1).

1
ответ дан Markus Schnell 14 September 2012 в 21:41
поделиться
  • 1
    Согласно ответу здесь, you' ре оба права: " Подрывная деятельность использует вперед дельты в репозиториях FSFS и отсталые дельты в BDB Repositories" stackoverflow.com/questions/8824597/… – Dave Forgac 10 April 2012 в 17:36

уровень ++ передаст уровень в DoStuff и затем увеличит уровень для использования в остальной части функции. Это могло быть довольно противной ошибкой, поскольку рекурсия никогда не будет заканчиваться (от того, что показывают , DoStuff всегда передается то же значение). Возможно ++ уровень предназначен вместо этого, поскольку это - противоположность уровень ++ (уровень инкрементов, и передает увеличенное значение в DoStuff)?

level+1 передаст level+1 в [1 112] DoStuff и отпуск уровень , неизменный для остальной части функции.

27
ответ дан workmad3 14 September 2012 в 21:41
поделиться
  • 1
    Имел подобную проблему с URL Объекта Блоба, созданным в Рабочем, который неявно отменялся после закрытия Рабочего. Ваш ответ получил меня на правильном пути, добавив, что тайм-аут прежде, чем закрыть Рабочего зафиксировал его.. Спасибо! – meyertee 3 November 2015 в 22:39

Первый фрагмент кода использует постоперационный оператор инкремента, таким образом, вызов выполняется как DoStuff (уровень);. если Вы хотите использовать инкрементный оператор здесь, используйте DoStuff (++ уровень);.

0
ответ дан Steve Moyer 14 September 2012 в 21:41
поделиться

Первое использует значение на уровне и ЗАТЕМ incrmenting это.

последний использует level+1 в качестве переданной переменной.

2
ответ дан Henry B 14 September 2012 в 21:41
поделиться
  • 1
    " у Нас в настоящее время есть Несколько терабайт данных, главным образом двоичных. Мы контроль/фиксация ежедневно до 50 гигабайтов данных. Всего у нас в настоящее время есть 50 000 revisions". That' s невероятный! Так как Вы записали это в 2013, сделал Вы видите, что любое улучшение потребления ресурсов ЦП выпускает Вас упомянутый путем перемещения в более новые версии Подрывной деятельности (если Вы мигрировали; мог бы быть ад перемещающий такой огромный repo)? – vijucat 16 November 2016 в 13:43
public DoStuff(int level)
{

  // DoStuff(level);
  DoStuff(level++);
  // level = level + 1;
  // here, level's value is 1 greater than when it came in
}

Это на самом деле увеличивает значение уровня.

public DoStuff(int level)
{
  // int iTmp = level + 1;
  // DoStuff(iTmp);
  DoStuff(level+1);
  // here, level's value hasn't changed
}

на самом деле не увеличивает значение уровня.

Не огромная проблема перед вызовом функции, но после вызова функции, значения будут отличаться.

1
ответ дан Wes P 14 September 2012 в 21:41
поделиться
  • 1
    Достаточно странно, это wasn' t проблема со мной, но я должен был добавить, что задержка прежде, чем добавить привязку в документ, тем не менее, заставила ее работать главным образом с Вашей идеей. – downhand 26 July 2016 в 06:47

Поскольку первый пример действительно эквивалентен:

public DoStuff(int level)
{  
  // ...
  int temp = level;
  level = level + 1;
  DoStuff(temp);
  // ...
}

Записка, которую можно также написать ++ уровень; это было бы эквивалентно:

public DoStuff(int level)
{  
  // ...
  level = level + 1;
  DoStuff(level);
  // ...
}

лучше не злоупотребить ++ и - операторы, по-моему; это быстро становится сбивающим с толку и/или неопределенным, что действительно происходит, и современные компиляторы C++ не генерируют более эффективный код с этими операторами так или иначе.

29
ответ дан Frederik Slijkerman 14 September 2012 в 21:41
поделиться
  • 1
    Просто требуемый, чтобы отметить, которые задерживаются 0 работы точно также от того, что я могу сказать - для Firefox просто нужна подсказка что безотносительно you' ре, делающее, может пойти до конца стека вызовов, фактическая продолжительность, кажется, не важна. – Jon z 28 May 2016 в 15:59
Другие вопросы по тегам:

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