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