Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In C why do you need a statement after a goto label?

Tags:

c

gcc

I am writing some C code and in my code I have two nested loops. On a particular condition I want to break out of the inner loop and continue the outer loop. I tried to achieve this using a label at the end on the outer loop's code and, on the condition, goto that label. However gcc gives an error that I cannot have a label at the end of a compound statement. Why not?

Note 1: This is not a switch statement and that question has been answered elsewhere.

Note 2: This is not a question about style and whether I should or should not be using goto statements or conditional variables instead.

EDIT: People have asked for an example and I can give a slightly facile example of checking if an array is a subarray of another array

    int superArray[SUPER_SIZE] = {...}, subArray[SUB_SIZE] = {...};
    int superIndex, subIndex;

    for (superIndex=0; superIndex<SUPER_SIZE-SUB_SIZE; superIndex+=1)
    {
      for (subIndex=0; subIndex<SUB_SIZE; subIndex+=1)
        if (superArray[superIndex+subIndex] != subArray[subIndex])
          goto break_then_continue;

      // code that executes if subArray is a sub array

      break_then_continue:
    }
like image 626
AntonDelprado Avatar asked Mar 16 '12 02:03

AntonDelprado


People also ask

What is the purpose of label in goto statement?

Syntax of goto Statement goto label; ... .. ... ... .. ... label: statement; The label is an identifier. When the goto statement is encountered, the control of the program jumps to label: and starts executing the code.

Which operator is used after label in goto statement?

goto label; A label's name is a user defined identifier and is distinguished by the colon that immediately follows its name. The statement immediately followed after “label:” is the statement to be executed after goto statement.

What is GOTO label in C?

The goto statement is known as jump statement in C. As the name suggests, goto is used to transfer the program control to a predefined label. The goto statment can be used to repeat some part of the code for a particular condition.

Is goto a statement?

GoTo (goto, GOTO, GO TO or other case combinations, depending on the programming language) is a statement found in many computer programming languages. It performs a one-way transfer of control to another line of code; in contrast a function call normally returns control.


2 Answers

In the standard it's explicitly said that labels belong to a statement, therefore a simple semicolon (;) after your label can circumvent the problem you are running in to, since that counts as a statement.

There is even an example of the use of an "empty"1 statement in 6.8.3/6.

EXAMPLE 3 A null statement may also be used to carry a label just before the closing } of a compound statement

while (loop1) {   /* ... */    while (loop2) {     /* ... */      if (want_out)       goto end_loop1;      /* ... */   }    /* ... */    end_loop1: ; } 

1In the standard this is referred to as a null statement.


6.8.1 Labeled statements

Syntax   1 labeled-statement:       identifier : statement       case constant-expression : statement       default : statement 

Notice that statement isn't optional in the above quotation.


  • open-std.org: n1124.pdf
like image 119
Filip Roséen - refp Avatar answered Sep 25 '22 17:09

Filip Roséen - refp


You simply need to write:

label: ;

The semi-colon is an empty statement. You need it because the language is defined like that; you need to go to a statement, even if it is an empty one.

    for (int i = 0; i < N; i++)
    {
        for (int j = 0; i < M; j++)
        {
            ...
            if (some_condition)
                goto continue_loop1;
            ...
        }
continue_loop1: ;
    }

You can argue about the indentation on the label.

like image 29
Jonathan Leffler Avatar answered Sep 21 '22 17:09

Jonathan Leffler