Zach
Zach

Reputation: 650

Iterating a for loop outside of the initial conditions

For instance let's say I have the normal loop:

for(var i = 0; i < 25; i++)
{
       //code executes here
}

Notice the i++ I know it iterates the loop however, I am wonder if I can iterate elsewhere in the loop. Like so:

for(var i = 0; i < 25)
{
     //code executes here
     i++;
}

I attempted to implement it but it did not work. Is it possible to do it in this way?

Upvotes: 3

Views: 134

Answers (3)

Alex Huszagh
Alex Huszagh

Reputation: 14644

You can use any combination of statements for C-style "for" loops.

Initializer

The first statement is the initializer. This can be blank.

for (var i = 0; ...)      // initializing in loop
for (; ...)               // initializing outside of loop

Break Condition

The next statement is the condition: this typically cannot be blank unless you have a break statement in the loop, otherwise the for loop will become infinite. This is the greatest difference between "for" loops and "while" loops, so don't omit it.

for (;;) { 
    break;
}

Incrementor

The final statement is the incrementor. This increments the value so the break condition can trigger. You can easily omit this as well, as long as all branches of the loop will increment the value.

for (var i = 0; i < 25;) {
    i++;     // here's our incrementor
}

Why C-Style Loops Have Conditions Inside the Loop

Decomposing the full C-style for loop into each of it's pieces does the following:

var i = 0;
for(;;) {
    if(i < 25) {
        // your normal code would go here
        i++;
    }
    else {
        break;
    }
}

There are many good reasons this is condensed into a single block within the "for" loop: writing code like this is verbose, prone to bugs, and makes it easy to create infinite loops by accident (crashing your program or exhausting a CPU until the program is quit).

Why Your Example Fails

You need to explicitly state you have a blank statement with at least 2 semicolons (3 statements) inside the loop. Otherwise, the code cannot be interpreted. The following line only has 2 semicolons:

for(var i = 0; i < 25)

The correct line is the following:

for(var i = 0; i < 25;)

Abstracting

Decomposing for loops to either change the break condition or the incrementor is bad form. Don't do it. However, if you must, this is probably a case of wanting to use a "while" loop. Typically, you wish to turn all of your suitable "while" loops into "for" loops, but there are rare exceptions. Just be warned: this easily leads to infinite loops, using up resources until you end the interpretor. "For" loops protect you from this.

Upvotes: 1

HopefullyHelpful
HopefullyHelpful

Reputation: 1819

You might be interested in break and continue statements. They give you more control over your loop.

//test if prime
var testInt = 42
for(int i = -10; i < testInt; i++) {
if(i<2) continue;
if(testInt%i==0) break;
}

Just make sure that no continue is called without previously changing the value of your variable. Otherwise an infinite loop is created.

An infinite loop in javascript is very bad. It freezes the browers and debugger, which means it is nasty to debug.

Upvotes: 0

Pointy
Pointy

Reputation: 413966

There has to be a third expression in the for loop header, but it doesn't have to do anything and can in fact be empty. All you need is the semicolon.

for(var i = 0; i < 25; )
{
       //code executes here
       i++; // increments "outside of initial conditions"
}

Note that the for loop construct exists in the form it does because that's a very common pattern, and sticking to it whenever possible is a good idea to avoid unpleasant mistakes. For example, it means that you have to be careful with continue statements in the body of the loop:

for (var i = 0; i < 25; ) {
  // code ...
  if (whatever)
    continue;
  // code ...
  i++;
}

The continue statement in a for loop does evaluate the third header expression, but it will skip the expression inside the loop body.

Upvotes: 5

Related Questions