Today while i was coding , I encounter something which I didn't expect it to happen in this way.Below is just an example code for the problem.
The Code 1
while(true)
{
int i = 1;
printf("This is %d\n" , i);
++i;
if(i == 10)
break;
}
The Code 2
for(int i = 1 ; ; i++)
{
printf("This is %d\n" , i);
if(i == 10)
break;
}
The Question :
1.)The first code would causes infinite loop while the latter is not.
2.)I don't understand , there's a standard mention variable declare inside while loop can be accessed by any statement inside the while loop , but why the if() can't access the value of variable i while the latter can??
Thanks for spending time reading my question
It's very simple:
for(int i = 1 ; ; i++)
{
printf("This is %d\n" , i);
if (i == 10)
break;
}
is equivalent to
{
int i = 1;
while (true)
{
printf("This is %d\n" , i);
if (i == 10)
break;
i++;
}
}
I.e., the int i = 1 part is executed before the first iteration of the for-loop. for introduces an implicit extra scope block holding any variables declared in the X of for (X;Y;Z).
C has the notion of block scopes. A variable declared in a given scope has a lifetime equivalent to that scope. In the while loop case that means there is one i variable for every iteration of the loop. Every time the loop restarts it creates a new i and sets it's value to 1. The i++ only evaluates once on that instance and hence it will never reach 10 and will indeed infinite loop.
The first code sample can be fixed by simply moving the i before the while loop.
int i = 1;
while (true) {
printf("This is %d\n" , i);
++i;
if(i == 10)
break;
}
Now i is declared in the outer scope and hence there will be one i for all of the iterations of the while loop.
The for loop case works for nearly the same reason. The iteration variable declared in a for loop is defined once for all iterations of the loop.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With