首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解写得很差的代码,CS过去2年的论文

理解写得很差的代码,CS过去2年的论文
EN

Stack Overflow用户
提问于 2012-04-16 23:44:57
回答 3查看 703关注 0票数 10

问题是描述代码做什么,函数做什么。

以下代码是过去二年级C和C++模块试卷的一部分。任务是描述下面这段代码的作用。我已经完全按照展示的方式编写了代码,并添加了一些自己的注释。

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-16 23:55:38

代码语言:javascript
复制
// what type is unsigned size?

这是一个名为sizeunsigned int。你把它加到一个指针上,就像在正常的指针运算中一样--把这个指针移到数组的末尾。

代码语言:javascript
复制
while (1) if (*(--b)==z){y[0] = tmp; return b - y;};

好的,我们有

  • while(1) = while(true),或者‘循环forever'
  • *(--b)预减b并从数组的索引中读取值
  • 如果我们找到了z,将第一个元素替换为我们从中读取的值,并返回b-y -

算法作为我们在的数组索引

也就是说,我们向后扫描数组,以找到z的最后一个实例,并返回找到它的索引。我们总是会在数组中找到z,因为我们把它作为第一个元素放在那里,也就是说,如果z不在数组中,那么我们返回0。

代码语言:javascript
复制
// are the following 3 lines ever even reached?

不,我想不是这样的。

票数 10
EN

Stack Overflow用户

发布于 2012-04-16 23:55:35

无符号大小是什么类型

unsignedunsigned int的缩写。

为什么要将int添加到int数组中?

指针和数组不是一回事。您所显示的代码使用的是指针,而不是数组。在int * b = y + size;行之后,b是一个指针,它指向y所指向的条目size条目。例如,如果size2,则b将指向第三个条目。ASCII-art:

代码语言:javascript
复制
+---------+
| 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在注释中指出的那样,如果size0 on entry,则循环将开始并继续超过开头( y所指向的位置),这可能最终会导致程序因内存访问冲突而失败。

票数 7
EN

Stack Overflow用户

发布于 2012-04-17 00:16:14

这段代码要做的第一件事就是证明作者是无能的。但我猜这是任务的一部分:理解不称职的人编写的代码。

对于初学者:

  • unsigned是一个有效的C++类型,是unsigned int的缩写。通常最好避免这种情况,除非你的doing manipulations.
  • There在你的代码中没有数组;你将一个整数加到一个指针上。奇怪的是,[]不是数组索引,而是

定义为使a[b]*(a+b)完全等效。(至少对于内置类型是这样的。)您可能想要找到一本关于C的书来解释这一点;在C++中,我们通常使用std::vector,这正是为了避免所有关于指针算法的混乱。

至于你难以理解的部分:对于初学者,让我们以一种理智的方式来编写:

代码语言:javascript
复制
while ( true ) {
    -- b;
    if ( *b == z ) {
        y[0] = tmp;
        return b - y;
    }
}

唯一会引起问题的是返回语句:这是指针减法;在本例中,由于y是数组的第一个元素(从代码的其余部分判断),因此b - y计算b指向的元素的索引。

这里指针的使用将是纯粹的混淆,除了这个习惯用法在C中无处不在,并在C++中通过迭代器进行。

您说得对,循环之后的代码永远不能执行;离开循环的唯一方法是通过return

编写循环的一种更简洁的方法是:

代码语言:javascript
复制
int i = size;
while ( i != 0 && y[i - 1] != z ) {
    -- i;
}
y[0] = tmp;
return i;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10177331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档