PDA

Просмотр полной версии : [Вопрос] Предекремент и постдекремент



Димарио
04.07.2019, 19:06
Столкнулся с такой конструкцией:

for(new i = strlen(inputtext); i != 0; --i)
{
}

И у меня появился вопрос, а верна ли она?
Ведь предекремент сначала убавляет значение, а потом выдаёт результат, так что в таком случае последний символ не будет прочитан или как?
Не лучше ли здесь использвать постдекремент?
Или типа последний символ это экстра ячейка, в которой так и так не хранятся символы?(перебирается, как видите, массив)
Но так же ведь и нулевой символ тоже не будет читать, в условии тогда должно стоять i != -1?

Daniel_Cortez
04.07.2019, 20:22
И у меня появился вопрос, а верна ли она?
Едва ли: перебор строки inputtext начнётся с завершающего '\0' и закончится 1-м символом, символ на 0-й позиции будет пропущен.
В правильном виде цикл должен выглядеть примерно так:

for(new i = strlen(inputtext) - 1; i >= 0; --i)

или так:

for(new i = strlen(inputtext); i-- != 0; )



Ведь предекремент сначала убавляет значение, а потом выдаёт результат, так что в таком случае последний символ не будет прочитан или как?
Верно, но причина не в пред- или постдекременте, а в том, как работает цикл for: выражение для инкремента/декремента переменной счётчика выполняется после тела цикла, а не перед ним (при этом проверка условия выхода выполняется перед телом цикла).


Не лучше ли здесь использвать постдекремент?
Между пред- и постдекрементом разница есть только если он используется внутри выражения, например вот так:

new x = 1;
new y = ++x; // x = x + 1, y = x
new z = x++; // z = x, x = x + 1

При "одиночном" же пред-/постдекременте переменной разницы никакой нет.

Димарио
04.07.2019, 20:48
Спасибо огромное!
for(new i = strlen(inputtext) - 1; i >= 0; --i)
А вот в этом случае указав число 1 убирается последний символ с конца?(То есть в данном случае '\0')?

Daniel_Cortez
04.07.2019, 20:55
Именно так.