Вопрос про цикл for

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: Вопрос про цикл for

Сообщение xchgeaxeax » 22.01.2024 16:02:16

Seenkao писал(а):Если хочешь то можешь привести пример, когда значение не определено для значения счётчика по выходу из цикла.

Я говорил про то, что в разных реализациях компиляторов паскаля цикл for может организовываться по разному и счетчик после цикла не имеет точного значения. Т.е. какой-то компилятор может выполнять проверку на достижение значения последнего элемента цикла, а какой-то на выход за рамки указанного диапазона значений. Или у одного компилятора цикл for использует прединкременты, а в большинстве постинкременты. Как на C можно писать for (i = 0; i < 9; ++i) или for (i = 0; i <= 8; ++i) или for (i = 0; i < 9; i++) или for (i = 0; i <= 8; i++) или for (i = 0; ++i < 9; ) или for (i = 0; ++i <= 8; ) или for (i = 0; i++ < 8; ) или for (i = 0; i++ <= 7; )
Поэтому для переносимости кода надо воспринимать значение счетчика цикла for как неопределенное.

Seenkao писал(а):по сути там не должно сохраняться i = 5, по простой причине, что данная переменная задействована. Какова правильная реализация в Си, не знаю. В Паскале не сохранится.

Этим и отличается C от Паскаля. В паскале все переменные предопределяются перед блоком их действия, а в С все переменные объявляются в блоке их действия или предыдущих. Т.е.
Код: Выделить всё
int i = 5; // это одна переменная
for (int i = 0...) // Это другая переменная объявленная в блоке for, но с тем же именем


Вот так будет нагляднее
Код: Выделить всё
#include <iostream>

int main(int argc, char *argv[]) {
    int i = 5;
    for (int i = 0; i <= 8; ++i) std::cout << &i << " = " << i << " ";
    std::cout << std::endl << &i << " = " << i << std::endl;
    for (int i = 0; i <= 8; ++i) {
      if (i == 8) break;
      std::cout << &i << " = " << i << " ";
    }
    std::cout << std::endl << &i << " = " << i << std::endl;
    return 0;
}

0x7fffbb42c3e4 = 0 ... = 1 ... = 2 ... = 3 ... = 4 ... = 5 ... = 6 ... = 7 ... = 8
0x7fffbb42c3e0 = 5
0x7fffbb42c3e4 = 0 ... = 1 ... = 2 ... = 3 ... = 4 ... = 5 ... = 6 ... = 7
0x7fffbb42c3e0 = 5
xchgeaxeax
новенький
 
Сообщения: 90
Зарегистрирован: 11.05.2023 03:51:40

Re: Вопрос про цикл for

Сообщение svk12 » 22.01.2024 16:12:27

ZWolol писал(а):Вопрос стоял в том: почему результат i нельзя использовать.


Условие продолжения цикла for проверяется до выполнения тела цикла,
поэтому на последнем шаге переменная цикла достигнет предельного значения, случился ли там break или нет.
svk12
постоялец
 
Сообщения: 407
Зарегистрирован: 09.06.2008 18:42:47

Re: Вопрос про цикл for

Сообщение Seenkao » 22.01.2024 16:19:22

xchgeaxeax писал(а):Вот так будет нагляднее

подобные действия ЯП ломают правильное понимание работы кода. Из-за этого и не понимание топикстартера, как работает код.

Вообще мне многим из подобных действий Си (или подобных ему ЯП) и не нравится. Каждый раз когда заходишь в функцию, там объявляется переменная (должна объявляться), но в каких-то реализациях вызывая очередной раз функцию, оказывается, что переменная уже имеет конкретное значение и работает именно от этого значения, а не от начального, как ожидаешь.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: Вопрос про цикл for

Сообщение ZWolol » 22.01.2024 18:55:25

В общем я понял, что на результат влияют много параметров: версия компилятора и то как звезды сошлись.
У меня на Borland C 3.2, Borland C++ Builder 6.0 и Microsoft C++ 5.0 звезды не влияли.
Ну что ж, учтем...
ZWolol
новенький
 
Сообщения: 21
Зарегистрирован: 06.01.2023 06:49:21

Re: Вопрос про цикл for

Сообщение Sharfik » 22.01.2024 20:40:19

xchgeaxeax писал(а):Я говорил про то, что в разных реализациях компиляторов паскаля цикл for может организовываться по разному и счетчик после цикла не имеет точного значения. Т.е. какой-то компилятор может выполнять проверку на достижение значения последнего

В какой версии и при каких настройках FPC переменную i не сохранит с значением на котором у цикла был break?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 766
Зарегистрирован: 20.07.2013 01:04:30

Re: Вопрос про цикл for

Сообщение xchgeaxeax » 22.01.2024 23:08:30

Sharfik писал(а):В какой версии и при каких настройках FPC переменную i не сохранит с значением на котором у цикла был break?

Если ограничиваться только FPC, тогда, возможно, что в любой версии значение будет корректным, а вот за другие компиляторы - не буду даже пытаться утверждать.
xchgeaxeax
новенький
 
Сообщения: 90
Зарегистрирован: 11.05.2023 03:51:40

Re: Вопрос про цикл for

Сообщение ZWolol » 23.01.2024 03:43:17

@Sharfik
>В какой версии и при каких настройках FPC переменную i не сохранит с значением на котором у цикла был break?
Проблем с номером i для break нет, но без break i равна последнему значению.
и нет возможности определить был ли break на последней строке или нет.

Lazarus
Версия: 2.2.4
Дата: 2022-09-24
Версия FPC: 3.2.2
Ревизия: lazarus_2_2_4
x86_64-win64-win32/win64

Настройки не менял, использовал все по умолчанию.
ZWolol
новенький
 
Сообщения: 21
Зарегистрирован: 06.01.2023 06:49:21

Re: Вопрос про цикл for

Сообщение RRYTY » 23.01.2024 06:34:07

Так и должно быть. Для определения достижения условия в цикле используйте отдельную переменную типа boolean.
RRYTY
постоялец
 
Сообщения: 187
Зарегистрирован: 25.12.2021 10:00:32

Re: Вопрос про цикл for

Сообщение Снег Север » 23.01.2024 09:12:38

RRYTY писал(а):Для определения достижения условия в цикле используйте отдельную переменную типа boolean.

Но почему обязательно boolean? Любую переменную, в зависимости от цели такого определения - например того же типа, что элементы просматриваемого массива и присваивать значение найденного элемента.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2997
Зарегистрирован: 27.11.2007 16:14:47

Re: Вопрос про цикл for

Сообщение Mikhail » 23.01.2024 10:05:23

О чем спор? Вот выдержка из документации.

The value of the loop variable is undefined after a loop has completed or if a loop is not executed at all. However, if the loop was terminated prematurely with an exception or a break or goto statement, the loop variable retains the value it had when the loop was exited.


Ну и использование цикла for для такой задачи не лучшая идея.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Вопрос про цикл for

Сообщение RRYTY » 23.01.2024 14:36:12

Снег Север писал(а):Но почему обязательно boolean?


Потому что break либо был, либо нет. Условие проверено в цикле.
RRYTY
постоялец
 
Сообщения: 187
Зарегистрирован: 25.12.2021 10:00:32

Re: Вопрос про цикл for

Сообщение Sharfik » 23.01.2024 17:26:54

RRYTY писал(а):
Снег Север писал(а):Но почему обязательно boolean?


Потому что break либо был, либо нет. Условие проверено в цикле.

В случае вопроса темы Boolean прекрасно заменяется на Integer и выполняет ту же функцию и при этом отображает был найден или нет объект. Два параметра одной переменной. iResult>-1 значит что то нашли.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 766
Зарегистрирован: 20.07.2013 01:04:30

Re: Вопрос про цикл for

Сообщение DedFrend » 24.01.2024 00:57:04

По мне вопрос не в том - сработает или нет. Вопрос - а на фига?
Вам не жалко человека, который, возможно, будет такое читать? Зачем усложнять ему жизнь, когда можно do while использовать?
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: Вопрос про цикл for

Сообщение xchgeaxeax » 24.01.2024 01:16:01

DedFrend писал(а):Вам не жалко человека, который, возможно, будет такое читать? Зачем усложнять ему жизнь, когда можно do while использовать?

do while? Может repeat <operators> until <false_condition>. do {} while (<true_condition>) это из С.
xchgeaxeax
новенький
 
Сообщения: 90
Зарегистрирован: 11.05.2023 03:51:40

Re: Вопрос про цикл for

Сообщение ZWolol » 24.01.2024 06:59:00

Меня интересовало лишь: почему for на паскале работает не как на других языках?
Но если в описании сказано, что так и должно быть, то у меня вопросов больше нет.

Наверняка можно это исправить, но основное правило программиста:
если заметил, что что-то работает не так, то лучше указать в описании на эту "особенность" программы.
иначе, исправляя это получишь другие косяки... :)
ZWolol
новенький
 
Сообщения: 21
Зарегистрирован: 06.01.2023 06:49:21

Пред.След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

Рейтинг@Mail.ru