1

我接受了一项开卷测试,并被告知我可以使用任何我需要的资源来回答这些问题,因为它更像是一项能力测试——一个问题让我非常难过。

这个问题要求编写一个与给定类似的函数 - 我确信我可以做到 - 但我找不到关于该函数正在做什么的太多信息,并且给出一个小样本很难确定正在发生的事情。

问题如下:

程序打印什么?请编写一个等效的 getValue 函数。

int t[]={1,2,3};
int getValue(int i)
{
  return "\5\3\8"[t[i]];    
}
void main()
{
  printf("%d",getValue(2));    
}

程序打印“0”,这是最简单的部分。我很想用一个简单的方法来回答这个问题。但我想更深入地了解 getValue 函数中到底发生了什么。我的主要好奇心是字符串部分在 lambda 表达式方面的作用,因为 \8 不是有效的八进制,但似乎对结果值有一些影响。

不寻找直截了当的答案(据我所知,这就是我使用作业标签的原因),只是朝着正确的方向前进

谢谢您的帮助

4

3 回答 3

2

转义码不是八进制的,我相信它们是十进制的。无论如何,只要它们只占用一个字节,它们就无关紧要。

跟踪它的执行是微不足道的。首先,我们考虑替换参数

int t[]={1,2,3};
int getValue()
{
  return "\5\3\8"[t[2]];    
}
int main() //int, not void
{
  printf("%d",getValue());    
}

的第三个值t是 3,它产生字符串中的第四个字符。由于字符串文字是三个字符,加上 NULL 终止符,那么第四个字符就是 NULL 终止符。当转换为整数时,该值为零。该printf调用正确打印此整数。例如,类似的函数将直接索引到字符串中。

于 2012-07-23T00:49:17.343 回答
2

好吧,追踪执行。首先,用2调用getValue。在里面,它首先计算t[i]的值,即t[2],也就是3。然后,它从字符串中取出索引3处的字符。

这部分值得解释一下。字符串常量由 4 个字符组成 - ASCII 5、ASCII 3、ASCII 8 和终止空值 (ASCII 0)。由于字符串索引在 C 中是从零开始的,因此索引 3 处的字符为空。它从字符串中检索,从 char 扩展到 int(因为函数返回一个 int),然后返回。在那里,它被迅速打印出来。

\__字符串中的符号表示“带有代码 __ 的字符”。

于 2012-07-23T00:49:29.497 回答
0

查看 C 常见问题解答 6.11。Steve Summit 要求人们不要将直接 URL 发布到 FAQ 项目,所以从http://www.c-faq.com/开始并导航到 6.11。

另请注意 Michael Burr 对 OP 的评论回复。

于 2012-07-23T21:40:07.277 回答