我在采访中得到了这个问题,这似乎很简单,但我想证实我对其运作的理解。
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然后检查是否为非零?在给定代码中,如果i1非零,则循环维持条件仅为1条件?因此在while循环中,条件检查较少。
我们可以写成:
f (char *p, char *q, int n)
{
for(i=n;i--;)
*q++ = *p++;
}
对我而言似乎简单快捷。
请告诉我你的意见。
答案 0 :(得分:1)
首先在你的回答中你似乎没有考虑n&gt;&gt; 2整数 - 在循环之前将n除以4。 然后,你不检查第二个条件,即如果n%4 == 0,则不复制该值。
我会给出类似的东西
f (char *p, char *q, int n)
{
int i1 = n >> 2; //i1 = n / 3;
int i2 = n & 3; //i2 = n & 0b111 = n % 4;
for(; i1 + 1 ; --i) {
*q++ = *p++;
if (i2) *q++ = *p++;
}
}
提到for循环更容易理解,就像 高效,
并且更改单个if的switch语句 声明更清晰,最有可能表现相似。
然后我会在结束时注意到我在按位上添加了注释 使他们的职能更加清晰的行动。