Увеличение значения счетчика цикла for - PullRequest
1 голос
/ 20 октября 2011

Есть ли какой-нибудь язык программирования / скрипт, который не позволяет увеличивать счетчик цикла FOR внутри цикла?

Например:

for(int i = 0; i < 10; i++) 
{
    i++;
    print i
}

Output: 1 3 5 7 8 9

Ответы [ 6 ]

4 голосов
/ 20 октября 2011

Не уверен, что я полностью понимаю ваш вопрос, но,

в питоне:

for i in range(10):
    print i
    i+=1  #if I print i now I will get i+1, 

Вы получите тот же результат, что и:

for i in range(10):
    print i

т.е.:

0 1 2 3 4 5 6 7 8 9

2 голосов
/ 20 октября 2011

PL / SQL не позволяет изменять переменные цикла:

SQL> begin
  2    for i in 1..10 loop
  3      i := i + 1;
  4    end loop;
  5  end;
  6  /
    i := i + 1;
    *
ERROR at line 3:
ORA-06550: line 3, column 5:
PLS-00363: expression 'I' cannot be used as an assignment target
ORA-06550: line 3, column 5:
PL/SQL: Statement ignored
2 голосов
/ 20 октября 2011

Паскаль (для одного примера) в основном говорил, что изменение переменной в цикле дает неопределенное поведение (Руководство пользователя Паскаля, §C.3): «Управляющая переменная, начальное значение и конечное значение должны быть одного скаляраtype (исключая тип real) и не должны изменяться оператором for. "

IIRC, Ada не позволяет вам вносить такие изменения.Глядя на Библию, кажется, подтверждаю мою слабую память (Ada 95 RM, §5.5 (10)): «Параметр цикла является константой; его нельзя обновить в sequence_of_statements цикла».

1 голос
/ 20 октября 2011

Я думаю, что циклы C ++ 11 для диапазонов позволяют вам предотвратить это:

for (const int i : some_range) {
    ++i; // forbidden
}

Но я не думаю, что стандарт предоставляет простой способ определения целочисленного диапазона, как в обычномfor петля.some_range может быть контейнером или boost::counting_range.

Считаете ли вы, что этот "счетчик цикла FOR" зависит от вас.Я полагаю, что «правильным» примером будет цикл, который принимает произвольное выражение для изменения счетчика между циклами (i++ в вашем примере), но не позволяет изменять счетчик в цикле, кроме этого выражения.

1 голос
/ 20 октября 2011

Я не знаю ни одного языка, явно запрещающего это. Но есть разные представления о том, какие последствия это имеет.

  1. Переменная, как в C

    В C этот цикл приводит к эффективному выполнению шагов 2, как очевидно.

  2. Итератор, как в Python

    В Python такой цикл заполняется итератором, который постоянно выдает новые значения независимо от переменной.

    for i in range(0, 100):
       print "A:", i
       i += 1
       print "B:", i
    

    ведет к

    A: 0
    B: 1
    A: 1
    B: 2
    ....
    

    в то время как ваш цикл в C, снабженный правильными выходами, приведет к

    A: 0
    B: 1
    A: 2
    B: 3
    ....
    
0 голосов
/ 20 октября 2011

Не то, что я знаю.Тем не менее, в C # вы можете сделать a для каждого, и он выдаст исключение, если коллекция будет изменена.

int[] myArray = new int[100];
foreach (var item in myArray)
{

}
...