My point is that in my mind, the warning is there to tell the
programmer that they've probably done something stupid.
Yep.
In the case of an expression without side effects, that's clearly the case
(whether the result is void or not). Even in the situation where the
expression is nonvoid, if it has side effects, it's probably still
doing what I want.
Yes. This is why we don't warn for things like:
int x;
++x; // returns int
printf("foo"); // returns int
etc. However, we do warn for useless computation like:
(x);
+x;
printf("foo")+printf("foo");
etc.
We don't warn for operators that have side effects. ?: does not have a side effect, so we warn for it.
Similar to your use of ?:, we warn for:
foo() || bar();
because || does not have a side effect. Note that C is not perl, just like C is not ML :). If you want to use conditional code, using an if statement is a perfectly reasonable thing to do.
Since the spec allows ?: to work on void, it's obviously intended that
it can be used as syntactic shorthand for an if statement. Why
shouldn't it be usable for expressions which happen to be nonvoid, but
where the side-effect is the more important part - printf/fprintf for
example?
I'm not really sure what to say here. What the spec says is not the issue. Warnings, again, are for valid code - erroneous code is rejected by the compiler. Except for a couple of strange things, the standard has nothing to say about warnings.
-Chris