Wydaję mi się, że jest to związane z typem.
i%3 nie jest typu bool, lecz typu int.
Przypuśćmy, że gdzieś w programie miałbyś taki fragment kodu:
bool b = true;
if (b == true) {
...
} else {
...
}
Mogłoby to być napisane również w ten sposób:
bool b = true;
if (b != false) {
...
} else {
...
}
albo tak:
bool b = true;
if (b) {
...
} else {
...
}
Domyślnie masz true = 1, false = 0.
W fragmencie kodu if (i%3) tak jakby możemy to tłumaczyć tak:
jeśli i%3 nie jest falsem, czyli jeśli i%3 nie jest 0.