我有一个问题:
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您可以在互联网上搜索数十篇有关序列点
的文章。这些东西与未定义的行为
和未指定的行为
一样糟糕。您可以阅读this帖子,特别是已接受答案中的未定义行为和序列点之间的关系是什么?
部分。
也许这个面试问题暗示了你对序列点的了解,那么它并不像我所看到的那么基础,但是永远不会
编写这样的代码,即使是为你的宠物项目,我甚至不想提及生产代码。这很愚蠢。
如果他们寻找经验丰富的 C++/C 开发人员,他们根本不应该问这样的问题。
编辑
只是关于序列点的提示,因为我在其他发布的答案和评论中看到了一些误解。这是*--*++cpp+3
而不是未指定的行为
或未定义的行为
(我的意思是它通常是一个糟糕的代码) ,但是这个是:
int i =1;
*--*++cpp+i+i++;
上面的代码是未排序
且未指定
。请阅读未定义行为
、未指定行为
、实现定义行为
和序列点
之间的差异e.g. here我写这一切是为了向您解释为什么您应该完全避免如此糟糕的代码(无论从语言标准的角度来看它是否合法)。是的,您的代码是合法的,但不可读,而且,正如您在我的编辑中看到的那样,一些小的更改使其非法
。不要以为我们不想帮助您,我的意思是,无论在哪里询问,与您类似的代码通常都是糟糕的代码。如果他们要求你解释为什么
这样的代码是糟糕且脆弱的,那就更好了 - 那么这将是一个很好的面试问题。
附注实际输出是一个空字符串,因为您打印了一个空终止符。请参阅下面的一个很好的答案 - 它解释了前面的 C 运算符的输出(您也应该学习它,这样这些问题就不会打扰您了)。
关于c - C语言程序输出中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23778552/