3

我正在阅读 K&R 的 C 编程语言,在结构部分中我遇到了这些代码片段:

struct maxpt = { 320, 200 };

/* addpoints: add two points */
struct addpoint(struct point p1, struct point p2)
{
    p1.x += p2.x;
    p1.y += p2.y;
    return p1;
}

在第一种情况下,它看起来像是将值 320 和 200 分配给变量 maxpt 的成员。但是我注意到缺少结构类型的名称(不应该是“struct struct_name maxpt = {320, 200}”吗?在第二种情况下,函数返回类型只是“struct”而不是“struct name_of_struct”。

我不明白为什么它们不包含结构名称 - 它如何知道它正在处理的特定类型的结构?我的困惑是因为在前面的片段中它们确实包含结构名称,例如在以下函数的返回类型中,它是“结构点”而不仅仅是“结构”。为什么它们在某些情况下包含名称而在其他情况下不包含?

/* makepoint: make a point from x and y components */
struct point makepoint(int x, int y)
{
    struct point temp;
    temp.x = x;
    temp.y = y;
    return temp;
}
4

2 回答 2

5

我的 K&R 副本在第 128 页包括:

struct point maxpt = { 320, 200 };

在第 130 页:

struct point addpoint(struct point p1, struct point p2)
{
    p1.x += p2.x;
    p1.y += p2.y;
    return p1;
}

这是第二版,第 47 次印刷,2011 年 2 月。

如果您的 K&R 副本包含其他内容,我认为这是错误的。

于 2013-10-19T04:13:47.433 回答
1

这是一个错字。我有一个副本女巫在第 115 页有同样的错误,应该是struct point maxpt = { 320, 200 };

后面没有变量列表的结构声明不保留存储空间;它仅描述结构的模板或形状。但是,如果声明被标记,则该标记可以稍后在结构实例的定义中使用。例如,给定point上面的声明,

 struct point pt;

定义了一个变量 pt,它是一个 `struct point` 类型的结构。一个结构可以通过遵循其定义来初始化,其中包含一个初始化器列表,每个初始化器都是一个常量表达式,用于成员:

struct maxpt = { 320, 200 };

自动结构也可以通过赋值或调用返回正确类型结构的函数来初始化。

在第 117 页:

下一步是一组对点进行算术运算的函数。例如,

/* addpoints: add two points */
struct addpoint(struct point p1, struct point p2)
{
    p1.x += p2.x;
    p1.y += p2.y;
    return p1;
}

这里的参数和返回值都是结构。我们增加了组件,p1而不是使用显式的临时变量来强调结构参数像其他任何东西一样按值传递。

于 2013-10-19T04:28:59.617 回答