Несмотря на то, что это ужасный вопрос для интервью, на самом деле он довольно интересен:
static unsigned char buffer[256];
int main(void)
{
unsigned char *p, *q;
q = (p = buffer) + sizeof(buffer);
/* This statement will set p to point to the beginning of buffer and will
set q to point to one past the last element of buffer (this is legal) */
while (q - p)
/* q - p will start out being 256 and will decrease at an inversely
exponential rate: */
{
p = buffer;
while (!++*p++);
/* This is where the interesting part comes in; the prefix increment,
dereference, and logical negation operators all have the same
precedence and are evaluated **right-to-left**. The postfix
operator has a higher precedence. *p starts out at zero, is
incremented to 1 by the prefix, and is negated by !.
p is incremented by the postfix operator, the condition
evaluates to false and the loop terminates with buffer[0] = 1.
p is then set to point to buffer[0] again and the loop continues
until buffer[0] = 255. This time, the loop succeeds when *p is
incremented, becomes 0 and is negated. This causes the loop to
run again immediately after p is incremented to point to buffer[1],
which is increased to 1. The value 1 is of course negated,
p is incremented which doesn't matter because the loop terminates
and p is reset to point to buffer[0] again.
This process will continue to increment buffer[0] every time,
increasing buffer[1] every 256 runs. After 256*255 runs,
buffer[0] and buffer[1] will both be 255, the loop will succeed
*twice* and buffer[2] will be incremented once, etc.
The loop will terminate after about 256^256 runs when all the values
in the buffer array are 255 allowing p to be incremented to the end
of the array. This will happen sometime after the universe ends,
maybe a little sooner on the new Intels ;)
*/
}
return p - q;
/* Returns 0 as p == q now */
}
По сути, это счетчик base-256 (при условии 8-битных байтов) с 256 цифрами, программа закроется, когда весь счетчик "перевернется".
Причина, по которой это интересно, заключается в том, что код на самом деле является полностью допустимым C (нет неопределенного или определенного реализацией поведения, которое вы обычно обнаруживаете в таких типах вопросов), и на самом деле существует законная проблема алгоритма, хотя и немного скрытая перемешать. Причина, по которой это ужасный вопрос для интервью, заключается в том, что я не ожидал, что кто-нибудь вспомнит приоритет и ассоциативность операторов, участвующих в операторе while. Но это делает для забавного и проницательного маленького упражнения.