私の理解では、左辺値は単なる場所であり、対応する右辺値はその場所に格納されている値です。例えば:
int x;
x = 0; /* the compiler will replace x with the location where 0 will be stored */
int y = x; /* x works as an rvalue here, its content is unknown until run time */
コンパイラはコンパイル時に x の値が 0 であることを 3 行目で認識できるので、y を値 0 で直接初期化できます (実行時まで待機し、実行時に最初に x の値を取得してから与えるのではなく)その値を y) に?
int *p = &x;
*p = 3;
ここで、2 行目の *p は左辺値 (x の位置) です。&x はコンパイル時にわかるので、*p もコンパイル時にわかりますよね?
コンパイラは単純に *p を x の位置に置き換えますか? それとも、最初に p に格納されているアドレスを取得し、次にそのアドレスに 3 を割り当てるコードを生成しますか?