I can't get my head around why the code below is not working as expected:
#include <stdio.h>
int main() {
int i = 0, size = 9, oneOrZero[] = {1,1,1,1,1,1,1,1,0};
while (i < size && oneOrZero[i++]);
if (i == size) printf("All ones"); else printf("Has a zero");
}
Terminal: All ones.
When incrementing the index inside the loop makes the code run as expected:
#include <stdio.h>
int main() {
int i = 0, size = 9, oneOrZero[] = {1,1,1,1,1,1,1,1,0};
while (i < size && oneOrZero[i]) {i++;}
if (i == size) printf("All ones"); else printf("Has a zero");
}
Terminal: Has a zero.
Could someone explain the difference between these two?
In the first code, when
iis8,oneOrZero[i]will evaluate tofalsebecauseoneOrZero[8]==0, butiwill be incremented to9anyway, the increment is not dependent on the truthiness of the expression, it will happen as many times as the expression is evaluated.So naturally when
i == sizeis evaluated it's9 == 9, this is, of course,true, therefore"All ones"will be printed giving you the wrong output.In the second code
iis incremented inside the body of the conditional expression, this means it will only be incremented if the condition is met, so wheniis8,oneOrZero[i]will evaluate tofalseandiis not incremented, retaining its8value.In the next line statement
i == sizewill be8 == 9which isfalseand"Has a zero"will be printed, giving you the correct output.