Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 4 из 4
  1. #1
    Аватар для Димарио
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2017
    Сообщений
    18
    Репутация:
    0 ±

    Предекремент и постдекремент

    Столкнулся с такой конструкцией:
    Код:
    for(new i = strlen(inputtext); i != 0; --i)
    {
    }
    И у меня появился вопрос, а верна ли она?
    Ведь предекремент сначала убавляет значение, а потом выдаёт результат, так что в таком случае последний символ не будет прочитан или как?
    Не лучше ли здесь использвать постдекремент?
    Или типа последний символ это экстра ячейка, в которой так и так не хранятся символы?(перебирается, как видите, массив)
    Но так же ведь и нулевой символ тоже не будет читать, в условии тогда должно стоять i != -1?

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Димарио Посмотреть сообщение
    И у меня появился вопрос, а верна ли она?
    Едва ли: перебор строки inputtext начнётся с завершающего '\0' и закончится 1-м символом, символ на 0-й позиции будет пропущен.
    В правильном виде цикл должен выглядеть примерно так:
    1. for(new i = strlen(inputtext) - 1; i >= 0; --i)

    или так:
    1. for(new i = strlen(inputtext); i-- != 0; )


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

    Цитата Сообщение от Димарио Посмотреть сообщение
    Не лучше ли здесь использвать постдекремент?
    Между пред- и постдекрементом разница есть только если он используется внутри выражения, например вот так:
    1. new x = 1;
    2. new y = ++x; // x = x + 1, y = x
    3. new z = x++; // z = x, x = x + 1

    При "одиночном" же пред-/постдекременте переменной разницы никакой нет.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. 2 пользователя(ей) сказали cпасибо:
    whale (04.07.2019) Димарио (04.07.2019)
  4. #3
    Аватар для Димарио
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2017
    Сообщений
    18
    Репутация:
    0 ±
    Спасибо огромное!
    1. for(new i = strlen(inputtext) - 1; i >= 0; --i)

    А вот в этом случае указав число 1 убирается последний символ с конца?(То есть в данном случае '\0')?

  5. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Именно так.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. Пользователь сказал cпасибо:
    Димарио (04.07.2019)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •