If I have a function returning NULL on error (including EOF). So the program calls exit if the function doesn't return a non-zero value (func() || exit(1)).
I have: --/tmp/ex.c-- main() { char * buf[512]; while (gets(buf) || exit(0)) puts(buf); } -- compile w/: gcc -fpermissive --no-warnings -o /tmp/ex /tmp/ex.c Got: /tmp/ex.c: In function ‘main’: /tmp/ex.c:2:22: error: void value not ignored as it ought to be while (gets(buf) || exit(0) ) puts(buf); ^~~~~~~ I understand that the while is testing the value of exit "when it returns", but since it doesn't, why flag an error (if exit is part of C-standard?) but *especially*, why not a warning, like a type mismatch or such? But this: --/tmp/ex2.c-- main(){ char * buf[512]; while (1) { fgets(buf) || exit(1); fputs(buf); } } ---compile + output: > gcc -fpermissive --no-warnings -o /tmp/ex2 /tmp/ex2.c /tmp/ex2.c: In function ‘main’: /tmp/ex2.c:4:18: error: void value not ignored as it ought to be fgets(buf) || exit(1); ^~~~~~~ Ultra confusing -- how is exit value used? Isn't it thrown away?