@yo the reason C defines logical operators to return 0 or 1 is because they're boolean operations. now, C doesn't have a dedicated boolean type, but even without that wrapper this is still desirable behavior
for example take `(A && B) == (C && D)`
you would expect this to be true if A, B, C, and D are all non-zero. but the equality comparer in C just checks two numbers for equality. so even if they're all non-zero, if you don't coerce to 1 for true, this would return false (or 0) if B and D had different non-zero values
this is why you'll often see `!!x` in javascript, because this coerces a truthy value to a true boolean and a falsey value to a false boolean