在这个C拼图中要替换什么?
现在这是我从一些试卷中得到的一个愚蠢的谜题,遗憾的是我无法在过去的15分钟内弄明白。
#include int main(void){ /* */ putchar(*(wer[1]+1)); return 0; }
为了获得输出e
我们应该用什么替换代替。现在我们知道putchar
将int
作为参数,但是这段代码假设给出一个指针。这个问题是否有效?
由于根据定义a[i]
与*(a + i)
相同,因此可以将putchar()
参数转换为wer[1][1]
。 因此,像char *wer[2]
这样的东西将是一个令人满意的定义,并且任何值如wer[1][1] == 'e'
将起作用。
const char *wer[2] = { "failed", "test" };
char * wer[] = { "foobar", "he"};
首先,在您提到的代码中,putchar()的参数是
*(wer[1]+1)
这不是指针。 似乎wer [1]是一些指针,并且wer [1] + 1指向的地址被解除引用。 所以如果wer是一个指向int的指针数组,那么putchar参数应该是int,这很好。
现在代码代替了某些东西你可能没有清楚地提到e是什么意思,ea char或e是2.71 …(自然对数基数)在任何一种情况下都应该很容易用这段代码得到那个输出。
-广告
一个简单的答案是:
char **wer; putchar('e'); return 0;
例如,完整的代码如:
#include int main(int argc, char **argv) { /* Something starts here */ char **wer; putchar('e'); return 0; /* Something ends here */ putchar(*(wer[1] + 1)); return 0; }
输出是:
susam@swift:~$ gcc really-silly-puzzle.c && ./a.out && echo e susam@swift:~$
一个更有趣的问题是:什么是可以替换/ * * /以获得输出’e’的最短代码?
从非常迂腐的角度来看,这个问题没有正确的答案。 这个问题无效。 如果输出不以换行符结尾,则C语言本身不保证程序的输出。 见7.19.2 / 2
文本流是由行组成的有序字符序列,每行由零个或多个字符加上终止的换行符组成。 最后一行是否需要终止换行符是实现定义的。
此程序输出到标准输出,这是一个文本流。 这个程序的输出是依赖于实现的,无论你用什么代替/*
,这意味着这个问题可能对某些特定平台有意义,但它作为一个抽象的C语言问题毫无意义。
我非常怀疑你的审查员是否期待你的这种迂腐:)))