3

K&R の The C Programming Language を読んでいて、構造に関するセクションで次のコード スニペットに出会いました。

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}」ではないでしょうか? 2 番目のケースでは、関数の戻り値の型は「struct name_of_struct」ではなく、単に「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;
}

これは第 2 版、47 刷、2011 年 2 月です。

K&R のコピーに他のものが含まれている場合、それは間違っていると思います。

于 2013-10-19T04:13:47.433 に答える
1

これはタイプミスです。115ページに同じエラーがあるコピーウィッチがありますstruct point maxpt = { 320, 200 };

変数のリストが後に続かない構造体宣言は、ストレージを予約しません。構造のテンプレートまたは形状を説明するだけです。ただし、宣言がタグ付けされている場合、そのタグは後で構造体のインスタンスの定義で使用できます。たとえば、point上記の宣言を考えると、

 struct point pt;

struct point 型の構造体である変数 pt を定義します。構造体は、その定義に従って初期化子のリスト (それぞれがメンバーの定数式) を使用して初期化できます。

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 に答える