在这个C拼图中要替换什么?

现在这是我从一些试卷中得到的一个愚蠢的谜题,遗憾的是我无法在过去的15分钟内弄明白。

#include  int main(void){ /*  */ putchar(*(wer[1]+1)); return 0; } 

为了获得输出e我们应该用什么替换代替。现在我们知道putcharint作为参数,但是这段代码假设给出一个指针。这个问题是否有效?

由于根据定义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语言问题毫无意义。

我非常怀疑你的审查员是否期待你的这种迂腐:)))