до декремента против после декремента

Когда я должен использовать предварительный декремент и когда использовать постдекремент?

и для следующего фрагмента кода, следует ли использовать декремент до или после.

static private void function(int number)
{
    charArr = new char[number];
    int i = 0;
    int tempCounter;
    int j = 0;
    while(charrArr!=someCharArr)
    {
        tempCounter = number - 1;
        password[tempCounter] = element[i%element.Length];
        i++;
        //This is the loop the I want to use the decrementing in.
        //Suppose I have a char array of size 5, the last element of index 5 is updated
        //in the previous statement.
        //About the upcoming indexes 4, 3, 2, 1 and ZERO.
        //How should I implement it?
        // --tempCounter or tempCounter-- ?
        while (charArr[--tempCounter] == element[element.Length - 1])
        {
        }
    }
}

person sikas    schedule 25.12.2010    source источник
comment
Что касается вашего кода, я предполагаю, что он должен быть tempCounter = number;, password[tempCounter - 1] и charArr[--tempCounter], несмотря на то, что цикл while будет работать с неинициализированным массивом, а tempCounter может стать отрицательным.   -  person sjngm    schedule 26.12.2010
comment
Возможный дубликат В чем разница между ++i и i++   -  person TylerH    schedule 22.06.2016


Ответы (2)


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

int i = 100, x;
x = --i;                // both are 99

и

int i = 100, x;
x = i--;                // x = 100, i = 99

То же самое, очевидно, верно и для приращений.

person sjngm    schedule 25.12.2010
comment
поэтому charArr[--tempCounter] будет отличаться по значению от charArr[tempCounter--] в условии цикла while. Это уменьшит tempCounter перед проверкой условия. - person sikas; 26.12.2010
comment
@sikas: Я не понимаю твою вторую строчку. В обеих версиях внутри цикла будет использоваться одно и то же значение. Пре-/пост-декремент влияет только на то, что происходит внутри while-выражения. - person sjngm; 26.12.2010

у вас должно быть ++i; (не то, чтобы это имело значение) и должно быть tempCounter-- В противном случае вы пропустите «первый» индекс charArr

person EnabrenTane    schedule 25.12.2010
comment
В C#, iirc, до и после инкремента/декремента нет разницы в скорости. - person Jeff Hubbard; 26.12.2010
comment
Я обновляю значения charArr во втором цикле while с last index - 1 по index = ZERO. поэтому в условии цикла я должен использовать tempCounter-- или --tempCounter? - person sikas; 26.12.2010
comment
Это может быть верно для встроенных времен, но, как правило, неверно для пользовательских классов, которые определяют эти операторы. --i; может быть быстрее, но никогда не медленнее, чем i--;. Но мы оба знаем, что такая строка, как i--;, будет оптимизирована компилятором, особенно когда i имеет тип int. - person EnabrenTane; 26.12.2010
comment
@sikas я бы использовал while(tempCounter > 0) { charArr[tempCounter--] = /* value */ } - person EnabrenTane; 26.12.2010