Вы не можете ссылаться на сам документ в обновлении (пока). Вам нужно будет перебирать документы и обновлять каждый документ с помощью функции. См. этот ответ для примера, или этот для серверной стороны eval()
.
Когда Вы используете язык, который позволяет перегрузку оператора, и '+ < integer>'; был определен, чтобы сделать что-то другое, чем пост - и префикс '++ '.
С другой стороны, я только видел такое отвращение в школьных проектах*, если Вы встречаетесь с этим в дикой природе, у Вас, вероятно, есть действительно хорошее, хорошо зарегистрированный, причина.
[* стопка целых чисел, если я не ошибаюсь. '++' и '-' продвинутый и вытолканный, в то время как '+' и '-' выполнил нормальную арифметику]
Насколько мой опыт идет, выражение параметра оценено сначала и получает значение уровня. Сама переменная увеличена, прежде чем функция вызвана, потому что компилятор не заботится, используете ли Вы выражение в качестве параметра или иначе... Все, что это знает, - то, что это должно увеличить значение и получить старое значение как результат выражения.
Однако, по-моему, код как это действительно неаккуратен, с тех пор путем попытки быть умным, он делает, необходимо думать дважды о том, что действительно происходит.
Разъяснить все другие ответы:
+++++++++++++++++++++
DoStuff(a++);
эквивалентен:
DoStuff(a);
a = a + 1;
+++++++++++++++++++++
DoStuff(++a);
эквивалентен:
a = a + 1;
DoStuff(a);
+++++++++++++++++++++
DoStuff(a + 1);
эквивалентен:
b = a + 1;
DoStuff(b);
+++++++++++++++++++++
Пока заманчиво переписать как:
DoStuff(++level);
я лично думаю, что это менее читаемо, чем постепенное увеличение переменной до вызова метода. Как отмечено несколькими ответами выше, следующее было бы более ясным:
level++;
DoStuff(level);
возвращаемое значение 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)
.
level+1 отправляет, любой level+1 к функции. уровень ++ отправляет уровень в функцию и затем увеличивает его.
Вы могли сделать ++ уровень, и это, вероятно, даст Вам результаты, которые Вы хотите.
Первый пример использует значение 'индекса', увеличивает значение и обновления 'индекс'.
второй пример использует значение 'индекса' плюс 1, но не изменяет содержание 'индекса'.
Так, в зависимости от того, что Вы желаете сделать здесь, в хранилище могли быть некоторые неожиданности!
На уровне ++ Вы используете постфиксный оператор. Этот оператор работы после переменной используется. Это - после того, как это помещается на стек для вызванной функции, это увеличено. С другой стороны, уровень + 1 является простым математическим выражением, и это оценено, и результат передается вызванной функции. Если Вы хотите увеличить переменную сначала и затем передать ее вызванной функции, можно использовать префиксный оператор: ++ уровень
level++
возвраты текущее значение level
, затем увеличивает level
. level+1
не изменяется level
вообще, но DoStuff
назван со значением (level + 1)
.
уровень ++ передаст уровень в DoStuff и затем увеличит уровень для использования в остальной части функции. Это могло быть довольно противной ошибкой, поскольку рекурсия никогда не будет заканчиваться (от того, что показывают , DoStuff всегда передается то же значение). Возможно ++ уровень предназначен вместо этого, поскольку это - противоположность уровень ++ (уровень инкрементов, и передает увеличенное значение в DoStuff)?
level+1 передаст level+1 в [1 112] DoStuff и отпуск уровень , неизменный для остальной части функции.
Первый фрагмент кода использует постоперационный оператор инкремента, таким образом, вызов выполняется как DoStuff (уровень);. если Вы хотите использовать инкрементный оператор здесь, используйте DoStuff (++ уровень);.
Первое использует значение на уровне и ЗАТЕМ incrmenting это.
последний использует level+1 в качестве переданной переменной.
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
}
на самом деле не увеличивает значение уровня.
Не огромная проблема перед вызовом функции, но после вызова функции, значения будут отличаться.
Поскольку первый пример действительно эквивалентен:
public DoStuff(int level)
{
// ...
int temp = level;
level = level + 1;
DoStuff(temp);
// ...
}
Записка, которую можно также написать ++ уровень; это было бы эквивалентно:
public DoStuff(int level)
{
// ...
level = level + 1;
DoStuff(level);
// ...
}
лучше не злоупотребить ++ и - операторы, по-моему; это быстро становится сбивающим с толку и/или неопределенным, что действительно происходит, и современные компиляторы C++ не генерируют более эффективный код с этими операторами так или иначе.
0
работы точно также от того, что я могу сказать - для Firefox просто нужна подсказка что безотносительно you' ре, делающее, может пойти до конца стека вызовов, фактическая продолжительность, кажется, не важна.
– Jon z
28 May 2016 в 15:59