どうして
(a?b:c)=5;
「C」では、必要な左辺値を示しています
*(a?&b:&c)=5;
大丈夫ですか?2つの違いは何ですか?
a=1 と仮定すると、最初のケースでは b=5 となり、2 番目のケースでは*(&b)=5
.`となります。
私が理解できないのは、次のことb=5
です*(&b)=5
。
どうして
(a?b:c)=5;
「C」では、必要な左辺値を示しています
*(a?&b:&c)=5;
大丈夫ですか?2つの違いは何ですか?
a=1 と仮定すると、最初のケースでは b=5 となり、2 番目のケースでは*(&b)=5
.`となります。
私が理解できないのは、次のことb=5
です*(&b)=5
。
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 番目のケースを見てみましょう。?:
結果が右辺値式になることがわかっています。さて、式の分類について説明しましたが、式の結果の型はどうでしょうか。b
とc
が両方ともであると仮定するとint
、 の型も(a?b:c)
ですint
。
ただし、(a?&b:&c)
この式の型はint*
ではなくint
です。整数へのポインタです。「へのポインタ」型の右辺値式ですint
。b
のアドレス、または のアドレスのいずれかを返しますc
。
がありint*
、それを演算子で逆参照すると*
、何が得られますか? typeの左辺値式を取得しますint
。(a?&b:&c)
は type の右辺値式であるためint*
、逆参照すると、 type の左辺値式が得られますint
。この左辺値は、 の内容に応じてb
またはのいずれかを参照します。c
a
簡単に言えば、次のように機能します。
int *ptr = NULL;
if(a)
ptr = &b;
else
ptr = &c;
*ptr = 5;
特定のメモリ位置を指すポインタを取得し、指している位置に何かを格納します。それはとても簡単です。