0

どうして

(a?b:c)=5;

「C」では、必要な左辺値を示しています

*(a?&b:&c)=5;

大丈夫ですか?2つの違いは何ですか?

a=1 と仮定すると、最初のケースでは b=5 となり、2 番目のケースでは*(&b)=5.`となります。

私が理解できないのは、次のことb=5です*(&b)=5

4

1 に答える 1

6

b=5 または *(&b)=5 と書くと、どのような違いが生じるでしょうか?

2 つ目はポインタを取得し、bそのポインタを逆参照して、取得したポインタに 5 を格納します。

ただし、あなたの質問は本当の質問を無視しているようです.なぜ2番目のケースでは機能するのに最初のケースでは機能しないのですか. それは、C の式とその処理方法に関係しています。

?:演算子の結果は値です。具体的には、右辺値です。大まかに定義すると、右辺値は代入の左側に配置できない値です。割り当ての右側にある値であるため、そのように名付けられました。たとえば、式「5」は右辺値式です。5 = 40;ナンセンスなことはできません。

名前付き変数は左辺値です。左辺値を方程式の左辺に置くことができます。式は左辺値式です (スコープ内の変数名であるとa仮定します)。a

ただし、式(a + b)は左辺値ではなく右辺値式です。そして正当な理由があります。(a + b) = 30;できた以上のことはできません(5 + 10) = 30;

演算子の結果は、上記?:の演算子と同様に右辺値式+です。これは、なぜ(a?b:c) = 5;機能しないかを説明しています。右辺値式に値を割り当てようとしています。それは違法です。

次に、2 番目のケースを見てみましょう。?:結果が右辺値式になることがわかっています。さて、式の分類について説明しましたが、式の結果の型はどうでしょうか。bcが両方ともであると仮定するとint、 の(a?b:c)ですint

ただし、(a?&b:&c)この式の型はint*ではなくintです。整数へのポインタです。「へのポインタ」型の右辺値式ですintbのアドレス、または のアドレスのいずれかを返しますc

がありint*、それを演算子で逆参照すると*、何が得られますか? typeの左辺値式を取得しますint(a?&b:&c)は type の右辺値式であるためint*、逆参照すると、 type の左辺値式が得られますint。この左辺値は、 の内容に応じてbまたはのいずれかを参照します。ca

簡単に言えば、次のように機能します。

int *ptr = NULL;
if(a)
  ptr = &b;
else
  ptr = &c;

*ptr = 5;

特定のメモリ位置を指すポインタを取得し、指している位置に何かを格納します。それはとても簡単です。

于 2012-08-08T07:59:16.693 に答える