In K&R Section 5.10, in their sample implementation of a grep-like function, there are these lines:
while (--argc > 0 && (*++argv)[0] == '-')
while (c = *++argv[0])
Understanding the syntax there was one of the most challenging things for me, and even now a couple weeks after viewing it for the first time, I still have to think very slowly through the syntax to make sense of it. I compiled the program with this alternate syntax, but I’m not sure that the second line is allowable. I’ve just never seen *‘s and ++‘s interleaved like this, but it makes sense to me, it compiles, and it runs. It also requires no parentheses or brackets, which is maybe part of why it seems more clear to me. I just read the operators in one direction only (right to left) rather than bouncing back and forth to either side of the variable name.
while (--argc > 0 && **++argv == '-')
while (c = *++*argv)
Well for one, that’s one way to make anyone reading your code to go huh?!?!?!
So, from a readability standpoint, no, you probably shouldn’t write code like that.
Nevertheless, it’s valid code and breaks down as this:
First,
pis dereferenced. Then it is incremented. Then it is dereferenced again.To make thing worse, this line:
has an assignment in the loop-condition. So now you have two side-effects to make your reader’s head spin. YAY!!!