2012-07-23 69 views
1

我已经获得了一本开放的书本测试,并被告知我可以使用任何我需要的资源来回答问题,因为它更多的是能力测试 - 而且有一个问题让我很难过。带字符串/八进制数的int lambda表达式? (C++)

该问题要求写一个类似的函数给定 - 我敢肯定我可以做 - 但我找不到有关函数在做什么的很多信息,并且给定一个小样本,确定什么是棘手的正在发生。

的问题如下:

什么程序打印?请编写一个等效的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不是有效的八进制数,但似乎对结果值有一些影响。

不找一个直出答案(从我收集,这就是为什么我用的是作业标记),只是在正确的方向上推

感谢您的帮助

+8

该程序不包含lambda表达式。 – 2012-07-23 00:48:49

+4

“\ 8”在C++ 03中未定义行为,在C++ 11中定义实现,在C90中未定义行为,并且需要在C99中进行诊断。因此,问题的答案取决于您正在查看的标准和/或实现。 – 2012-07-23 01:10:37

+0

啊 - 以为是用了它们,深夜填饱肚子,用过度思考寻找失败了。谢谢大家! – 2012-07-23 02:32:38

回答

1

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

追踪执行此操作是微不足道的。首先,我们考虑一个替代为参数

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正确打印此整数。例如,一个类似的函数可以直接索引到字符串中。

+1

前两个转义码是八进制。 '8'具有实现定义的语义,因为'8'不是八进制数字,并且不是其他明确定义的转义序列之一。 – 2012-07-23 00:52:24

+0

我现在觉得很傻 - 总觉得这个太过分了。感谢堆的帮助 - 不幸的是,我不能upvote,直到我得到更多的代表:( – 2012-07-23 02:30:24

1

那么,跟踪执行情况。首先,使用2调用getValue。在内部,它首先计算t [i]的值,即t [2],它是3.然后,它从字符串获取索引3处的字符。

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

字符串中的\__表示法意味着“带有代码__的字符”。

+0

谢谢你的答案塞瓦 - 我觉得现在过度思考这个问题很愚蠢 – 2012-07-23 02:31:38

0

查看C FAQ 6.11。 Steve Summit要求人们不要直接向常见问题项目发布URL,因此请从http://www.c-faq.com/开始并导航至6.11。

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