Named Loops

21 Aug 2022

Here’s a neat thing I haven’t seen before. Other languages I’ve worked in haven’t had a neat way to break out of a set of nested loops to a particular loop. It’s not an issue that comes up a lot, but when it has I’ve solved it by creating a continue flag and having that as the first condition of each loop.

To explain, say if we had these two loops (in C):

int i; int j; char string[] = “This string”; int length = strlen(string);

for (i=0; i<=3; i++) {

for (j=0; j<length; j++) {
  printf("char:%c num:%d\\n", string\[j\], i);
}

}

and for some unexplained reason, we need to break out of both loops when we encounter a lowercase ‘t’. There is a C command to break out of a loop - break. But it only breaks out of the current loop:

int i; int j; char string[] = “This string”; int length = strlen(string);

for (i=0; i<=3; i++) {

for (j=0; j<length; j++) {
  printf("char:%c num:%d\\n", string\[j\], i);
  if (string\[j\] == 't') {
    break;
  }  
}

}

Since the outside loop that is iterating ‘i’ is not broken out of, we still end up looping through to the letter ‘t’ four times. Like this:

char:T num:0
char:h num:0
char:i num:0
char:s num:0
char:  num:0
char:s num:0
char:t num:0
char:T num:1
char:h num:1
char:i num:1
char:s num:1
char:  num:1
char:s num:1
char:t num:1
char:T num:2
char:h num:2
char:i num:2
char:s num:2
char:  num:2
char:s num:2
char:t num:2
char:T num:3
char:h num:3
char:i num:3
char:s num:3
char:  num:3
char:s num:3
char:t num:3

So in C/C++ I would convert the loops to while, and set a continue flag. First the whiles:

int i; int j; char string[] = “This string”; int length = strlen(string);

i = 0; while (i <=3) {

j=0;
while (j<length) {
  printf("char:%c num:%d\\n", string\[j\], i);
  if (string\[j\] == 't') {
    break;
  }  
  j++;
}

i++;

}

Then the flag, which I’ve called keepGoing:

int i; int j; char string[] = “This string”; int length = strlen(string) ;

int keepGoing = true; i=0; while (keepGoing==true && i <=3) {

j=0;
while (keepGoing==true && j<length) {
  printf("char: %c num: %d\\n", string\[j\], i);
  if (string\[j\]=='t') {
    keepGoing = false;
  }
  j++
}

}

This gives us the output we want and we can close the ticket. Note that I have
typedef’d true and false off-screen in the code above.

char:T num: 0
char:h num: 0
char:i num: 0
char:s num: 0
char:  num: 0
char:s num: 0
char:t num: 0

With Swift, we can just name the loops, then break out to a named loop level:

littleLoop: for i in 0…3 { bigLoop: for char in “This string” { print(“char:\(char) num:\(i)”) if char==“t”{ break littleLoop } } }

Note that I didn’t need to name the internal littleLoop, that was just showing off.