yuta_san0629
@yuta_san0629 (蜜柑 猫)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C#のi++に納得がいかない

ChatGPTに質問してもしっくりこない解答しか返ってこなかったのでこちらで質問します。

単刀直入に書きます。
なぜ、変数の値を1増加させる時はi++でできるなら、この形で2増加させる時はなんて書くんですか?

i++と同等の演算が、i=i+1で、2増加させる場合、i=i+2となるじゃないですか。
で、この場合どうするか、ChatGPTに聞いたら、i += 2と返ってきまして、なぜi++2にならないのか、
なぜ+=にならないのかがわからないです。

0

3Answer

変数の値を1増加させる時はi++でできるなら、この形で2増加させる時はなんて書くんですか?

++はインクリメント演算子といってC#に限らず様々な言語で使えますが、これは「変数の値を1増やす(インクリメントする)」ときに使用します。
1だけ増やすための操作なので、2増加させることはできないです。

インクリメント(1の増加)のみ特別な書き方がある点について、Wikipediaには「使用頻度が極めて高いため」という記載がありました。

インクリメント操作はループにおけるカウンタの増減や、逐次アドレッシングなどで使用頻度が極めて高いため、プロセッサレベルで専用の命令が用意されていることが多い。また、プログラミング言語のレベルでも、インクリメントをするときのための「インクリメント演算子」が用意されていることが多い。

2以上を増加させるのであれば i = i + 2 のように加算した上で代入するか、これをまとめて i += 2 のように書きます。

4Like

Comments

  1. @yuta_san0629

    Questioner

    なるほど、ウィキペディアは全く視野にありませんでした。ありがとうございます。
    なるほどそういうノリだったんですね

前のスレッドで C#, Unity の勉強を始めて 3, 4 日と書いた人ですよね。そういう人が何でそういうところに疑問を持つのか分かりませんが(i++2 というのが絶対必要という理由があれば書いてください)、そういうところにこだわって時間を使うより、そういうものだと割り切って、Unity の勉強を進めるのが良いと思いますけど。

勉強が進んで C# の文法的な知識などが得られたら、演算子のオーバーロードで可能かどうか、可能だったとして、それにより予期しない副作用が出ないかなどを考えてはいかがですか。

演算子のオーバーロード - 定義済みの単項演算子、算術演算子、等値演算子、および比較演算子
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/operator-overloading

1Like

Comments

  1. @yuta_san0629

    Questioner

    >>そういう人が何でそういうところに疑問を持つのか分かりませんが

    参考書を書いてて、ふと疑問に思ったものでして、++という書き方で1だけ増加させるという限定した使われ方が、その存在としてわからなかったからです。
    というか、i=i+1を短縮して書けると以前聞いたもので、ではなぜ。i++だけなのかという疑問に至ったわけです。
    なんとうか、気になったらなんか気持ち悪くて、そのまんまにしておけなくて
    ついつい質問してしまいました。
    申し訳ないです

    URLありがとうございます。
    暇つぶしに勉強します。

  2. 演算時 ++ は C の時代からあって、自分が持っている C の解説書によると "++ の方が短くて、しかもより一層効率的なことが多い" と説明されています。

    効率的とは、例えば C でポインタに ++ を適用する場合が特にそうだと思います。文字列をコピーするような場合、ポインタに ++ を適用して以下のようなコードにできます。

    void strcpy(char *s, char *t)
    {
        while ((*s++ = *t++) != '\0')
            ;
    }
    

    想像ですが、i++2 がないのは、必要性が低く(無いと言っても良いかも)、定義することによる好ましからざる副作用が出るかもしれないことを考えてだと思います。

  3. @yuta_san0629

    Questioner

    なるほど……わざわざお調べいただきありがとうございます。
    やはり実用的ではないということなんでしょうね。なんとなく理解が深まった気がします!

  4. おまけの話で余計なお世話かもしれませんが、i++2 がなぜ無いのだろうと考えるより、++ は前置きと後置きで結果が異なること、-- という演算子もあることを勉強した方が良いと思います。

    int n = 5;
    
    Console.WriteLine(n++);   // 5
    
    Console.WriteLine(++n);   // 7
    
    Console.WriteLine(n--);   // 7
    
    Console.WriteLine(--n);   // 5
    

    そんなことは言われなくても承知しているということであれば失礼しました。

  5. やはり実用的ではないということなんでしょうね。

    「実用的ではない」と言うより、普通は必要ないということでしょう。ただし、質問者さんのケースで i++2 がどうしても必要ということであれば話は違ってくると思います。

    最初の回答で、

    i++2 というのが絶対必要という理由があれば書いてください

    と書いたのはそういう理由です。

  6. 良回答はいろいろ出ているので、単なるコメントです。

    そういうところにこだわって時間を使うより、そういうものだと割り切って

    僕はそうは思わないな。 非常にいい質問だと思うし、新人を指導していてそういう質問をされたら「こいつはできるな」と思うはず。
    たしかに、インクリメント演算子は他の演算子とはバランスが悪い(1足すだけ)し、C#あたりだと、存在意義が伝わりにくいから、疑問に思うのは鋭いと思う。また、そういう類のことについての情報ってあまりないから、検索してもわかりにくい。
    これからもそういうことについて疑問に思ったら、進捗に影響の無い範囲でいろいろ調べるのは止めないでほしい。

(N)++ という形式の後置きインクリメント演算子 があって i ++ 2 だと 不正な演算子になるとかそういう話をしておられる?

1Like

Comments

  1. @yuta_san0629

    Questioner

    コメントありがとうございます。既にお二方により疑問が解決したのですが、なぜ、i++だけ特別にこの表記なのかというような疑問でした。
    URLありがとうございます。こちらも後学の為に一読しておきます!

  2. インクリメント / デクリメント は Cの頃からある演算子ですし、
    C# だと マルチスレッド時に 安全にインクリメントするってだけのメソッドすらありますのでインクリメントが特別視されているのはそうですね。

    ただ、 インクリメント演算子の様なものは C# の 最終処理系には存在しないので 演算子オーバーロードできるのは + です。

    例えばこう書くと

    using System;
    {
        var i = 0;
        i++;
        Console.WriteLine(i);
        i++;
        Console.WriteLine(i);
        i++;
        Console.WriteLine(i);
    }
    {
        var i = 0;
        i += 2;
        Console.WriteLine(i);
        i += 2;
        Console.WriteLine(i);
        i += 2;
        Console.WriteLine(i);
    }
    

    最終解釈はこう

    int num = 0 + 1;
    Console.WriteLine(num);
    int num2 = num + 1;
    Console.WriteLine(num2);
    Console.WriteLine(num2 + 1);
    int num3 = 0 + 2;
    Console.WriteLine(num3);
    int num4 = num3 + 2;
    Console.WriteLine(num4);
    Console.WriteLine(num4 + 2);
    

    playground

Your answer might help someone💌