1

なぜこれが不可能なのですか?

int c = 0;
++c++;

またはPHPで:

$c = 0;
++$c++;

変数 c を 2 ずつインクリメントするか、何か変なことをすると思いますが、代わりにコンパイル中にエラーが発生します。私は理由を考え出そうとしましたが、実際には何も得られませんでした...私の理由は次のとおりです。

  1. コンパイラは ++ を読み取ります
  2. 変数を読み取ります
  3. 変数の値をインクリメントし、アプリケーションの実行時に返されるようにするために行うことは何でもします。
  4. それは別の++に遭遇します
  5. 値をインクリメントする前にそれを返すために前の変数を使用します
  6. ここがややこしいところです: 変数 c を使用するのでしょうか、それとも (++c) が返した値を読み取ろうとするのでしょうか? または、varname++ しか実行できない (2++ は実行できない) ため、(++c) をポインターとして認識し、そのメモリ位置を読み取ろうとしますか? それが何をするにしても、なぜコンパイルエラーになるのでしょうか? それとも、コンパイラーのプログラマーはそれが何の役にも立たないことを知っていたので、エラーを予防しているのでしょうか?

これを使用したいというわけではありません。また、1 回限りの使用ではないコードに対しても確かにそうではありませんが、ただ興味があります。

4

3 に答える 3

6

同じ理由で、次のことはできません。

c++ = 5;

変更も代入もできない値を返します。これも実行時エラーではなく、コンパイル エラーです。(このように。)

参照を返すことも意味がありません。

$a = 1;
$b = $a++; // How can it be a reference if b should be 1 and a should be 2?
于 2012-09-01T20:48:15.043 に答える
3

これは必ずしも言語にとらわれないというわけではありませんが、異なる言語を目にすると少し驚かれることでしょう。

Cでは(したがって、Cに基づくすべての迷惑ではない言語であると思います)、演算子の優先順位は、式が と同等であることを意味します++(c++)。ステップバイステップに基づいて、 と同等であると予想していました(++c)++が、そうではありません。Postfix++は、 prefix よりも「より緊密にバインド」します++

誰もが言うように、式c++は変更可能なオブジェクトではなく値になります (オブジェクトを参照する C の式は左辺値と呼ばれます)。これが必要なのは、オブジェクトcが式が評価する値を保持しなくなったc++ためです。参照できるオブジェクトがありません。

c++C++ ( !と混同しないでください)++c では、左辺値です。cこれは、新しい値を持つobject を参照します。

したがって、C++(++c)++は構文的に正しいです。cタイプの場合、未定義の動作が発生しますint(少なくとも、C++ 03ではそうでした:C ++ 11は、以前は未定義であったものを定義しましたが、それらの変更については最新ではありません)。

したがって、演算子の優先順位が期待どおりである C++ のような言語を想像する (または先に考えて発明する) と、有効になるように手配でき++c++ます。おそらく、c2 回インクリメントし、古い値と新しい値の間の値に評価されます。この想像上の言語は、混乱しがちな C++ とわずかに異なるだけであるという意味で「煩わしい」ものです。

++c++cが両方のインクリメント演算子をオーバーロードするユーザー定義型のインスタンスである場合、C++ でも有効です。その理由は、ユーザー定義型の右辺値がオブジェクト(「一時オブジェクト」) であり、変更できるためです。しかし、式が評価されるとすぐに、一時的なものは破棄され、変更は失われます。

于 2012-09-02T00:52:50.977 に答える
1

これを説明する別の方法は、++演算子が左辺値のみを操作することです。ただし、それらを組み合わせると、またはのいずれかとして解析されます++(c++)(++c)++どちらの場合も、括弧の外側の演算子へのパラメーターはc、左辺値ではなく、右辺値 (インクリメントの前後の の値) です。

于 2012-09-01T21:05:33.363 に答える