gpt4 book ai didi

c - 这个程序的输出是什么,它返回给操作系统的是什么?

转载 作者:行者123 更新时间:2023-12-04 16:09:51 26 4
gpt4 key购买 nike

这有点像 C 谜题。你必须告诉程序是否完成了它的执行,如果是,它运行了多少时间以及它返回给操作系统的是什么。

static unsigned char buffer[256];

int main(void)
{
unsigned char *p, *q;
q = (p = buffer) + sizeof(buffer);
while (q - p)
{
p = buffer;
while (!++*p++);
}
return p - q;
}

[编辑]我删除了采访问题标签,因为这似乎是人们反对的主要内容。这是一个很棒的小谜题,但正如每个人都已经指出的那样,这不是一个很好的面试问题。

最佳答案

尽管这是一个可怕的面试问题,但它实际上很有趣:

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 */
}

本质上这是一个 256 位的 base-256(假设 8 位字节)计数器,当整个计数器“翻转”时程序将退出。

之所以有趣,是因为代码实际上是完全合法的 C(没有您通常在这些类型的问题中发现的未定义或实现定义的行为)并且实际上有一个合法的算法问题,尽管有点隐藏,在混合。这是一个可怕的面试问题的原因是因为我不希望任何人记住 while 语句中涉及的运算符的优先级和关联性。但它确实是一个有趣且富有洞察力的小练习。

关于c - 这个程序的输出是什么,它返回给操作系统的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/279837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com