3

実際のコードでプリインクリメントポストインクリメントのユースケースを見たことがありません。私が最も頻繁に目にする唯一の場所はパズルです。
私の意見では、有用であるというよりも混乱を招きます。

  • これの実際のユースケースシナリオはありますか
  • += を使用してこれを行うことはできませんか

    y = x++

    y = x
    x += 1

4

3 に答える 3

7

これは同じことを短く書くだけの方法であり、C (a)を深く理解していない人を混乱させるだけです。置換についても同じ議論を行うことができます。

for (i = 0; i < 10; i++)
    printf ("%d\n", i);

と:

i = 0;
while (i < 10) {
    printf ("%d\n", i);
    i = i + 1;
}

anyは , orforで行うこともできるためwhile:

i = 0;
loop: if (i < 10) {
    printf ("%d\n", i);
    i = i + 1;
    goto loop;
}

条件とから任意のループ構造を構築できるためgotoです。でも(私は望んでいますが)あなたはそうしないでしょう?


(a)私は時々、これを簡単なステートメントと副作用として生徒に説明したいと思います。これにより、C コードをより簡潔にすることができ、通常は読みやすさが損なわれないか、最小限に抑えられます。

ステートメントの場合:

y = x++;

ステートメントは、後でインクリメントされる副作用xを伴う代入です。副作用が事前に発生するだけです。yx++x

同様に、割り当ての副作用は、割り当てられた値として評価されることです。つまり、次のようなことができます。

while ((c = getchar()) != -1) count++;

そして、次のようなものになります:

42;

完全に有効ですが、役に立たない C ステートメントです。

于 2010-03-25T05:36:59.933 に答える
6

プレインクリメント演算子とポストインクリメント演算子は、歴史に照らして考え、いつ考案されたかを考えると、はるかに理にかなっています。

C が基本的に PDP-11 マシン用の高水準アセンブラーであった時代、</flamebait>現在のように優れた最適化コンパイラーが登場するずっと前に、ポストインクリメント演算子が最適である一般的なイディオムが使用されていました。このようなもの:

char* strcpy(char* src, char* dest)
{
  /* highly simplified version and likely not compileable as-is */
  while (*dest++ = *src++);
  return dest;
}

問題のコードは PDP-11 (またはその他の) 機械語コードを生成し、これらの種類のプレインクリメントおよびポストインクリメント操作とデクリメント操作を正確に組み込んだ基本的なアドレス指定モード (相対直接および相対間接など) を多用しました。

あなたの質問に答えるために: 言語は最近これらを「必要」としていますか? いいえ、もちろん違います。物事を計算するための命令に関しては、ほとんど必要ないことが証明されています。「これらの機能は望ましいものですか?」と尋ねると、質問はより興味深いものになります。それに対して、私は限定された「はい」と答えます。

あなたの例を使用して:

y = x;
x += 1;

対。

y = x++;

頭のてっぺんから2つの利点を見ることができます。

  1. コードはより簡潔です。あなたが何をしているのかを理解するために私が知る必要があるすべてのことは、分散するのではなく、1 か所にまとめられています (私がその言語を知っている限り)。2 つの行にまたがって「広げる」ことは難しいことのように思えますが、何千もの行を実行すると、最終的に大きな違いが生じる可能性があります。
  2. 2 番目のケースでは、粗末なコンパイラで生成されたコードでもアトミックになる可能性がはるかに高くなります。最初のケースでは、適切なコンパイラがなければ、おそらくそうはなりません。(すべてのプラットフォームに優れた強力な最適化コンパイラがあるわけではありません。)

+=また、それ自体が「不要な」言い方である場合について話していることは非常にわかりやすいと思います....結局、代わりにうまく提供できなかったx = x + 1;ために私が考えることができるユースケースシナリオはありません.+=_ = _ + _

于 2010-03-25T05:41:48.793 に答える
0

あなたはここで誤ってもっと大きな問題を提起しています。それは、年月 (数十年) が経つにつれて、ますます知られるようになる問題です。

言語は、提供すべきではない「能力」を提供するという過ちを犯すことがよくあります。IMO、++ はスタンドアロンのステートメントのみである必要があり、絶対に式演算子ではありません。

次のことを心に留めておいてください:目標は、有能なエンジニアが読めるコードを作成することではありません。目標は、有能なエンジニアが午前 3 時に疲れ果ててカフェインを摂取したときに読めるコードを作成することです。

エンジニアがあなたに「すべてのコード構造が問題を引き起こす可能性があります。自分が何をしているのかを知る必要があります。」と言っても、問題の一部として自分自身を暴露しただけなので、笑って立ち去ります。

つまり、次のようなコードは絶対に書かないでください。

a[aIndex++] = b[++bIndex];

この種のことについての興味深い会話をここで見つけることができ ます。

于 2014-12-06T14:41:54.227 に答える