【发布时间】:2023-04-07 21:52:01
【问题描述】:
我在面试中得到了这个问题,看起来很简单,但我想确认一下我对它的功能的理解。
f (char *p, char *q, int n)
{
int i1 = n >> 2;
int i2 = n & 3;
switch (i2)
{
do {
*q++ = *p++;
case 3: *q++ = *p++;
case 2: *q++ = *p++;
case 1: *q++ = *p++;
case 0: ;
} while (i1--);
}
}
我在面试中被问到以下问题:
- 这个函数有什么作用?
- 为什么有人会编写如此复杂的代码?
- 有没有什么不同的写法(更简单、更快)?
给出的答案:
此函数将*P指向的内存中的元素数量复制到*q指向的内存中。
-
如果你会用下面的for循环编写它(只写循环)
for(i=0;i<n;i++) *q++ = *p++;然后编译器在条件检查中花费更多 MIPS/时间。在这种情况下,它将首先从 n 中减去 i,然后检查 I 是否非零?在给定的代码中,如果 i1 非零,则 while 循环保持条件只有 1 个条件?因此在 while 循环中,条件检查较少。
-
我们可以写成:
f (char *p, char *q, int n) { for(i=n;i--;) *q++ = *p++; }对我来说,这似乎既简单又快捷。
请给我你的意见。
【问题讨论】:
-
一个好建议 - 在您在此处发布代码之前,将其写入您计算机上的文本编辑器中,然后将其复制到您的问题中。这样你就可以注意到一些类型,并得到正确的缩进。
-
看起来有人错误地编辑了您的代码?它应该是 do{switch(){..};}while();
标签: c optimization