What you're doing is idiomatic, if slightly ugly C.
In order to convince the compiler you know what you're doing, though, you could wrap the assignment into an additional set of parentheses:
while((arg = va_arg(ap, int)))
That should take care of the warning.
Update:
adding parenthesis around the assignment doesn't seem to supress the warning in the C99 compiler im using (PellesC). – Gary Willoughby
What, it didn't? Then you need to make the test a little more explicit:
while((arg = va_arg(ap, int)) != 0)
should do the trick. It could also be argued to be slightly more readable.
You're going to ask me what I mean by "slightly ugly."
From working with other languages, I'm used to having a clear separation between testing and modifying. You're doing a test in that while
of a value, but at the same time creating a side effect (namely reading in the next argument). As I said, this is considered pretty normal, yea "idiomatic" in C because a lot of C programmers do this; I think there are even examples of similar code in K&R.
By personal preference, I'd probably rewrite this as:
while (1) {
arg = va_arg(ap, int);
if (!arg) break;
...
}
This clearly separates the assignment from the test, and lets the loop stand alone as a (potentially) infinite loop. Many people would consider my code more ugly; as I said, it's a matter of personal preference.