電子書籍の厳選無料作品が豊富!

 お世話になります。C/C++初心者です。以前から気にな
っていましたが、ホームページのC言語の講座を見ていま
すと、後置き++(--)の優先順位がドット演算子と並んで
トップに位置付けされているのがよくあります。
 代入演算子よりも低く、むしろ一番低順位なのではと、
疑問に思っていますが、何か理由があるのでしょうか。
 まったく初歩的な質問ですがこの際ご教授願えればと
思いました。どうぞよろしくお願い申し上げます。

A 回答 (3件)

#1です。


演算子の動作について少し補足しておきます。

C言語の演算子の動作は「評価」と「実行」の2種類があります。
ここで「評価」という言葉がC言語では使われますが、どういう意味かというと簡単に言えばある値に置き換わると考えてください。
そして「実行」というのはある動作、たとえば変数に値が代入されるなどを言います。

たとえば「=」演算子の場合には
実行:左辺の変数に右辺の値を代入する。
評価:代入された値に評価される(置き換わる)
となります。

つまり
A=1
という式があった場合にAという変数に1が代入され(実行)、「A=1」自体は1に評価される(置き換わる)ということになります。

C言語では
A=B=1
という式が書けるのはご存知だと思いますが、これも演算子の「評価」と「実行」で考えると動作が明確にわかります。
「=」演算子は結合規則が右から左(結合規則は同じ式に同じ演算子があった場合にどちらから値を評価するかの基準です)なのでまず、「B=1」という式が評価されます。すなわち上の式は意味的には
(A=(B=1))
となり
(A=(B=1)) → (A=(1)) <---- 「B=1」が評価され1となった
という形になります
また当然、「実行」の動作としてBには1が代入されます。

そして次に(A=(1))が評価され最終的にはうえの式の評価値は
((1))
となります。
そして左の演算子の実行動作としてAにも1が代入されます。

後置++演算子の「評価」と「実行」は
実行:変数をインクリメント
評価:変数の元の値
なので
A=B++ (Bに1が入っているとすると)
(A=(B++)) → (A=(1))
と評価され、Bの実行動作としてBがインクリメントされます。(結果Bは2になる)
そして(A=(1))が評価され
結果的に
Aには1がBには2が代入されることになります。
    • good
    • 2
この回答へのお礼

 懇切丁寧なご教授ありがとうございました。結合規則、式の評価、
実行、特に今まで a=b=1 など漠然と取り扱っていただけに大変勉強
になりました。実はポインタのポインタとか、強制的な(テクニック
上の?)キャストとかを学ぶ上でこの演算子をはっきりとマスター
しておかなければと思っていたところです。今回お教え頂きました
ことはこれからの学習にすごく役立ちそうで感謝しています。
 ご親切なご教授本当にありがとうございました。

お礼日時:2005/03/23 21:03

既に回答が出ていますが、質問者さんは実行の優先順位のことを考えておられると思います。


実行の優先順位と式の評価の優先順位を分けて考えると、
後置演算子を優先度高く評価する必要がある事が分ると思います。
    • good
    • 0
この回答へのお礼

 実行の優先順位と式の評価の優先順位は分けて考える必要があ
るということですね。
 *po++について少し考えてみました。もし++が*よりも後順位だ
ったとすると++は(*po)と結合する以外になく、それではポインタ
をインクリメントしてそこにある内容を参照したい場合に困った
ことになる、そのような解釈でよろしいのでしょうか?
 どうぞよろしくお願い申し上げます。

お礼日時:2005/03/23 00:33

簡単に言えば、++演算子を先に評価しないと不自然になるからでしょう。


たとえば++演算子が一番低いと以下の式

A = B++;

は(A=B)++ という意味になってしまい、AにBを代入して、その結果をインクリメントするという意味(厳密に言えば定数をインクリメントすることになるのでエラーですが)になってしまい、Bがインクリメントされません。

++演算子のプライオリティが高いので上の式は
A = (B++) <--- 意味的にです。
となり、B++はBの元の値に評価され、その後でBがインクリメントされるため望んだ結果となります。
    • good
    • 0
この回答へのお礼

 分かりやすいご教示ありがとうございます。
++は'B'と結びついているのであって(A=B)と結びついているので
はない、これは演算の順序とは別、ということですね。式の評価
といいますのはそういう意味だったのですか。良く分かりました。
どうもありがとうございました。

お礼日時:2005/03/23 00:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!