我有个问题 :

char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;

int main()
{
    printf("%s ", *--*++cpp+3);

}


我无法理解输出= sQUIZ,
我的方法:首先它将指向cpp + 3,即c现在++ c表示指向“ MCQ”,其中*将给出值“ MCQ”,无法理解-之前*在这里将做什么。还是我的方法完全错误?

最佳答案

我将其发布为评论中提到的答案。您应该首先阅读以下内容:http://en.wikipedia.org/wiki/Sequence_point也看起来是here,并且您可以搜索Internet上有关sequence points的数十篇文章。这些东西与undefined behaviourunspecified behaviour一样不好。您可以阅读this帖子,尤其是已接受答案中的What is the relation between Undefined Behaviour and Sequence Points?部分。
 也许这个面试问题暗示了您对序列点的了解,但它并不像我所看到的那样基础,但是即使对于您的宠物项目,NEVER EVER也会编写这样的代码,我什至不想提及生产代码。真傻
如果他们寻找经验丰富的C ++ / C开发人员,那么他们根本不应该提出这样的问题。

编辑

只是有关序列点的提示,因为我在其他发布的答案和评论中看到了一些误解。这不是*--*++cpp+3unspecified behaviour(我的意思是它通常是错误的代码),但这是:

int i =1;
*--*++cpp+i+i++;


上面的代码是undefined behaviourunsequenced。请阅读有关unspecifiedundefined behaviourunspecified behaviourimplementation-defined behavior e.g. here之间的区别的信息。我写了所有这些信息是为了向您解释为什么您应该完全避免使用如此糟糕的代码(从角度来看是否合法)是否符合语言标准)。是的,您的代码是合法的,但是不可读,并且,正如您在我的编辑中看到的那样,对其进行了小幅更改。不要以为我们不想为您提供帮助,我的意思是,与您相似的代码总会在需要询问的地方都是不好的代码。如果他们要求您解释sequence points这样的代码不好又脆弱,那会更好-那么这将是一个很好的面试问题。

附言实际输出是一个空字符串,因为您打印了一个空终止符。在下面看到一个很好的答案-它从C运算符的前面解释了输出(您还应该学习它,这样的问题才根本不会打扰您)。

09-11 17:32