This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

about C my references are a bit unclear re this

by my references, I read that the below (x = n if no break) is true. However should that not be the case, and Keil can change it there is a great risk, thus I'd like another read on it.

a for loop

for ( x = 0 ; x < n ; x++)
{
  .......
  if (cond) break;
  .......
}
if (x = n)
{ // there was no break


can I count on x = n if 'cond' was never met and no break happened?

If that is not something that Keil can change, but standard, I can save a bunch of flags

Erik

Parents
  • I took a quick look at the C99 spec, and it doesn't seem to explicitly say. The ISO C99 spec is probably a suspect source anyway, since Keil doesn't even claim C99 compatibility in the first place, and also because C99 introduces the ability to declare loop variables in the loop, a la C++.

    Flying off at a tangent: Now that I've made the mistake of actually looking at the spec, I've acquired extra confusion. Referring to declarations in a for loop, it says:

    If clause-1 is a declaration, the scope of any variables it declares is the remainder of the declaration and the entire loop, including the other two expressions; it is reached in the order of execution before the first evaluation of the controlling expression.

    The scope of such loop control variables changed back and forth in C++ before it was standardized. Originally such variables didn't exist outside the scope of the loop. But then, as a practical matter, it's often useful to know the termination value outside the loop, as in Eric's question, and so the C++ committee moved the scope of the declaration to the enclosing block, so that the loop control variable would continue to exist after the loop. Otherwise you have to declare an extra variable just to record the termination value. But this text seems to say that C99 kept the original definition, and the variable exists only in the scope of the loop.

Reply
  • I took a quick look at the C99 spec, and it doesn't seem to explicitly say. The ISO C99 spec is probably a suspect source anyway, since Keil doesn't even claim C99 compatibility in the first place, and also because C99 introduces the ability to declare loop variables in the loop, a la C++.

    Flying off at a tangent: Now that I've made the mistake of actually looking at the spec, I've acquired extra confusion. Referring to declarations in a for loop, it says:

    If clause-1 is a declaration, the scope of any variables it declares is the remainder of the declaration and the entire loop, including the other two expressions; it is reached in the order of execution before the first evaluation of the controlling expression.

    The scope of such loop control variables changed back and forth in C++ before it was standardized. Originally such variables didn't exist outside the scope of the loop. But then, as a practical matter, it's often useful to know the termination value outside the loop, as in Eric's question, and so the C++ committee moved the scope of the declaration to the enclosing block, so that the loop control variable would continue to exist after the loop. Otherwise you have to declare an extra variable just to record the termination value. But this text seems to say that C99 kept the original definition, and the variable exists only in the scope of the loop.

Children
  • The ISO C99 spec is probably a suspect source anyway, since Keil doesn't even claim C99 compatibility in the first place

    Quite certainly true for Erik's Keil compiler, i.e. C51. The ARM tools might very well support C99.

    and also because C99 introduces the ability to declare loop variables in the loop, a la C++

    Precisely. As far as standard C before C99 was concerned, Erik's original observation is correct, but C99's support for loop-scoped variables muddies that water.

    Otherwise you have to declare an extra variable just to record the termination value

    Not really. You just have to move the definition to a place before the for loop. Immediately before should do:

       int i = 0;
       for ( ; i < 20 ; i++) {
          /* some code */
       }