title: What's the meaning of "block is entered recursively"?
body: <p>I asked a question on reddit. The question was literally <a href="https://www.reddit.com/r/C_Programming/comments/jwx8u0/why_the_starting_point_of_a_lifetime_of_an/" rel="nofollow noreferrer">Why does the starting point of a lifetime of an automatic object(which doesn't have VLA) precede a scope of an object?</a>
  <br/>And I got the answer which can be the example of my question.
  <br/><br/><strong>Code</strong></p>
  <pre><code>#include &lt;stdio.h&gt;
  
  int main(void) {
      int i = 0;
  back:
      printf(&quot;i = %d&quot;, i);
      int j;
      if (i &lt; 5) {
          if (i == 0)
              j = 0;
          j += i;
          printf(&quot;, j = %d\n&quot;, j);
          i++;
          goto back;
      }
      printf(&quot;\n&quot;);
  }
  </code></pre>
  <p><strong>Output</strong></p>
  <pre><code>i = 0, j = 0
  i = 1, j = 1
  i = 2, j = 3
  i = 3, j = 6
  i = 4, j = 10
  i = 5
  </code></pre>
  <p>But someone said &quot;The value of <code>j</code> becomes indeterminate when its declaration is reached, ...&quot; because of C17 6.2.4p6(with my bold)</p>
  <blockquote>
  <p>For such an object that does not have a variable length array type, its lifetime extends from entry
  into the block with which it is associated until execution of that block ends in any way. (Entering an
  enclosed block or calling a function suspends, but does not end, execution of the current block.) <strong>If
  the block is entered recursively, a new instance of the object is created each time.</strong> The initial value of the object is indeterminate. If an initialization is specified for the object, it is performed each time the declaration or compound literal is reached in the execution of the block; otherwise, the value becomes indeterminate each time the declaration is reached.</p>
  </blockquote>
  <p>Just going to a label in current block differs from repeating an entire associated block in a recursive function or an iterative statement. In this point of view, I don't think <code>j</code> is not affected by the rule(but it's just my thought).<br/><br/>
  By the way, I think there is a contradiction irrespective of which way we think. <br/>- If <code>int j;</code> isn't created anew in each sequence, it is a redefinition. <br/> - If <code>int j;</code> is created anew in each sequence, <code>j</code> shall have a garbage value from second sequence. But the output is shown as if the value of 'j' is retained.<br/><br/>
  I read quoted part of documentation over and over, but couldn't understand it. What am I missing?</p>