问题是描述代码做什么,函数做什么。
以下代码是过去二年级C和C++模块试卷的一部分。任务是描述下面这段代码的作用。我已经完全按照展示的方式编写了代码,并添加了一些自己的注释。
int g(int * y, unsigned size, int z) {
int tmp = y[0];
// what type is unsigned size? Int I presume. Why would you add an int to an array of ints?
int * b = y + size;
y[0] = z;
// I have the most difficulty understanding the following.
while (1) if (*(--b)==z){y[0] = tmp; return b - y;};
// are the following 3 lines ever even reached?
y[0] = tmp;
if (tmp == z) return 0;
else return -1;
}发布于 2012-04-16 23:55:38
// what type is unsigned size?这是一个名为size的unsigned int。你把它加到一个指针上,就像在正常的指针运算中一样--把这个指针移到数组的末尾。
while (1) if (*(--b)==z){y[0] = tmp; return b - y;};好的,我们有
while(1) = while(true),或者‘循环forever'*(--b)预减b并从数组的索引中读取值b-y -算法作为我们在的数组索引
也就是说,我们向后扫描数组,以找到z的最后一个实例,并返回找到它的索引。我们总是会在数组中找到z,因为我们把它作为第一个元素放在那里,也就是说,如果z不在数组中,那么我们返回0。
// are the following 3 lines ever even reached?不,我想不是这样的。
发布于 2012-04-16 23:55:35
无符号大小是什么类型
unsigned是unsigned int的缩写。
为什么要将int添加到int数组中?
指针和数组不是一回事。您所显示的代码使用的是指针,而不是数组。在int * b = y + size;行之后,b是一个指针,它指向y所指向的条目size条目。例如,如果size为2,则b将指向第三个条目。ASCII-art:
+---------+
| entry 0 |<--- `y` points here
| entry 1 |
| entry 2 |<--- `b` points here if `size` is `2`
| entry 3 |
| entry 4 |
+---------+我最难理解下面的内容。
while (1) if (*(--b)==z){y[0] = tmp; return b - y;};
该循环查看内存中由y指向的条目,从size标识的条目之前的条目开始。如果条目是== to z,则将y[0]设置为tmp并返回找到该条目的索引(通过使用指针算法,b - y返回b指向的位置和y开头之间的条目数量。由于--b递减指针,因此循环向后遍历内存。
下面的3行是不是已经达到了?
不是的。当找到第一个匹配条目时,return将退出函数,该条目可能在开头(因为y[0]在早期被设置为z )。不过,正如Ted Hoff在注释中指出的那样,如果size为0 on entry,则循环将开始并继续超过开头( y所指向的位置),这可能最终会导致程序因内存访问冲突而失败。
发布于 2012-04-17 00:16:14
这段代码要做的第一件事就是证明作者是无能的。但我猜这是任务的一部分:理解不称职的人编写的代码。
对于初学者:
unsigned是一个有效的C++类型,是unsigned int的缩写。通常最好避免这种情况,除非你的doing manipulations.[]不是数组索引,而是定义为使a[b]与*(a+b)完全等效。(至少对于内置类型是这样的。)您可能想要找到一本关于C的书来解释这一点;在C++中,我们通常使用std::vector,这正是为了避免所有关于指针算法的混乱。
至于你难以理解的部分:对于初学者,让我们以一种理智的方式来编写:
while ( true ) {
-- b;
if ( *b == z ) {
y[0] = tmp;
return b - y;
}
}唯一会引起问题的是返回语句:这是指针减法;在本例中,由于y是数组的第一个元素(从代码的其余部分判断),因此b - y计算b指向的元素的索引。
这里指针的使用将是纯粹的混淆,除了这个习惯用法在C中无处不在,并在C++中通过迭代器进行。
您说得对,循环之后的代码永远不能执行;离开循环的唯一方法是通过return。
编写循环的一种更简洁的方法是:
int i = size;
while ( i != 0 && y[i - 1] != z ) {
-- i;
}
y[0] = tmp;
return i;https://stackoverflow.com/questions/10177331
复制相似问题