• ベストアンサー

後置き++演算子の優先順位に関して

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

質問者が選んだベストアンサー

  • ベストアンサー
  • yangwenli
  • ベストアンサー率27% (20/73)
回答No.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が代入されることになります。

jasmine002
質問者

お礼

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

その他の回答 (2)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

既に回答が出ていますが、質問者さんは実行の優先順位のことを考えておられると思います。 実行の優先順位と式の評価の優先順位を分けて考えると、 後置演算子を優先度高く評価する必要がある事が分ると思います。

jasmine002
質問者

お礼

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

  • yangwenli
  • ベストアンサー率27% (20/73)
回答No.1

簡単に言えば、++演算子を先に評価しないと不自然になるからでしょう。 たとえば++演算子が一番低いと以下の式 A = B++; は(A=B)++ という意味になってしまい、AにBを代入して、その結果をインクリメントするという意味(厳密に言えば定数をインクリメントすることになるのでエラーですが)になってしまい、Bがインクリメントされません。 ++演算子のプライオリティが高いので上の式は A = (B++) <--- 意味的にです。 となり、B++はBの元の値に評価され、その後でBがインクリメントされるため望んだ結果となります。

jasmine002
質問者

お礼

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

関連するQ&A

  • 優先順位を決定するアルゴリズム

    優先順位を決定するアルゴリズムがありましたら ご教授下さい. やりたい事は,以下の通りです. ・A,Bの二人がいる. ・二人はそれぞれというパラメータを持つ. ・各自パラメータに優先順位をつけている. ・二人にとってのパラメータの優先順位を決定する 例)A,Bがそれぞれ,a,b,cというパラメータを持つ. 各自パラメータに優先順位をつけている. A a:1 b:2 c:3 B a:2 b:2 c:1 この時,二人にとってのパラメータの優先順位を決定する.私は,以下の方法を考えました. 1.二人のパラメータの優先順位を足して 合計値を計算する. 2.値が同じ場合は,値の分散値が低い方が,優先順位が低いとする a:1+2 = 3 b:2+2 = 4 c :3+1 = 4 bの分散値の二乗:(2-2)の二乗 + (2-2)の二乗 cの分散値の二乗:(3-1)の二乗 + (2-1)の二乗 よって,bとcでは,bの方が優先順位が低いとする この他にも,優先順位を決定するアルゴリズムに関して,他の方法や,既存研究等がありましたらご教授下さい.

  • c言語 優先順位について

    c言語 優先順位について 下記の優先順位で1番目は、()関数呼び出しであれば左結合なので(unsigned char)を呼ばれないで、(++(f) -> fpi)[-1]を呼ばれる理由を教えて頂きたい。      (unsigned char)(++(f) -> fpi)[-1]

    • ベストアンサー
    • CGI
  • 【C言語】if文内の演算子の優先順位について

    【C言語】if文内の演算子の優先順位について こんにちわ。初めて質問を投稿させて頂きます。 宜しくお願い致します。 【環境】 OS:Windows XP(SP3) コンパイラ:Visual C++ 6.0 CPU:AMD Athlon X2 4200+ 【質問】 私は下記のプログラムを実行しました --------------------------------- 【プログラム】 #include <stdio.h> int main( void ) { int i = 1; int j = 2; printf( "i = %d\n",i ); printf( "j = %d\n",j ); if( (i = 0) && (j = 200) == 200 ){ printf( "\n(1)-----------------------------\n" ); printf( "i = %d\n",i ); printf( "j = %d\n",j ); } printf( "\n(2)-----------------------------\n" ); printf( "i = %d\n",i ); printf( "j = %d\n",j ); return 0; } 【出力結果】 i = 1 j = 2 (2)----------------------------- i = 0 j = 2 //(※) --------------------------------- 私は【出力結果】(2)のj = 2という出力結果(上記(※)の行)は j = 200にならないとおかしいと思っております。 なぜなら、私は【プログラム】内のif文「if( (i = 0) && (j = 200) == 200 )」 の判定手順が下記の様になると考えているからです。  (1)i = 0を実行  (2)j = 200を実行  (3)(i = 0)の判定実行   →判定の結果「0」なので&&の右側の判定「(j = 200) == 200」    を行うまでも無くif文全体の判定がFALSE。 しかし、実際は「j = 200」が実行されてないので、上記(2)と(3)の 判定手順が逆転している様に見えます。 C言語の優先順位を見ると「&&」や「==」よりも「()」の方が高いと 記憶してるので、(2)→(3)の順に実行されないとおかしいと思ってます。 しかし、私の予想した結果と実際の出力結果が異なるので私の演算子の優先順位 やif文内での判定手順の理解に間違いがあると考えています。 出来ましたらどの点が間違っているのかご教授願えませんでしょうか? 宜しくお願い申し上げます。

  • 演算対象の数字と演算子を入力して計算させる

    数字と演算子をそれぞれ入力し、優先順位の高い順に四則演算させるにはどのような考え方をすればよいのでしょうか。 数字をa[7]とおいて、演算子をop[7]としてそれぞれ配列に格納しましたが、そこから先に進めません。 オペランドと演算子の組み合わせならば優先順に計算してくれるのはわかっていますが、オペランドと演算子を格納した配列では上手く行きません。 実は既に全ての演算子の組み合わせをIfで表示させるプログラムを根性で作ったのですが、最適解を知りたいです。 言語はCでvisualstudioを使っております。 条件はn回数字を入力したらn-1回演算子を入力し、n回目に=を入力する。nの最大値は7とする。です。 だらだらと見辛い文章で申し訳ありませんが、何卒宜しくお願いします。

  • C言語 代入演算子の意味をおしえてください

    今、C言語を勉強しているものですが、代入演算子でわからないことがあるのでおしえてください。 *=, %=, -= などはわかるのですが、 <<=, >>=, &=, ^=, |= の意味がわかりません。 どなかか教えてください。よろしくお願いします。

  • 演算子(+=)について

    演算子(+=)について C言語のプログラム中に(1)の文が存在するのですが、(2)の文と同じ意味でよろしいでしょうか? a+=8; ・・・(1) a=a+8; ・・・(2) 教授下さい。 よろしくお願い致します。

  • ベンゼンの命名法における優先順位の位置

    命名法の勉強をしています。 でも、ベンゼンがbenzylになる接頭語の時と benzenで終わる接尾語になる時があります。 ベンゼンにも優先順位があるのですか? もしよければベンゼンの優先順位の位置を教えてもらえませんか。 それと、厚かましいですが (C6H5)COOCH3 は、methylbenzcarboxylateですか? よろしくおねがいします。

  • 一つのタグ内での要素の優先順位?ってあるのでしょうか?

    こんにちは。よろしくお願いします。 自分が作成していたWebシステムのページをアクセシビリティチェックツール~にかけ出てきたエラーのことでちょっと疑問に思い質問させていただきます。 ・一つのタグ内の要素の優先順位は、厳密に言うとあるのだろうか? ということなんですがー。。。 チェックにかけた項目は <img>タグです。 ・<img src ="img.gif" alt ="イメージ画像" width ="100" height ="100"> と ・<img src ="img.gif" width ="100" height ="100" alt ="イメージ画像"> と、の違いなのですが、上記タグではOKが出るのですが、下記タグでは、間違い!!と表示されるようです。 この場合、<img>タグ内の要素について、src→alt→width→heightという優先順位がついているのか、それとも、ただ単にそのアクセシビリティチェックツールのバグなのか。 タグ内要素の優先順位~についてご存知の方がいましたら、ご教授願えませんでしょうか?よろしくお願いします。

    • ベストアンサー
    • HTML
  • 動くページの検索順位

    現在あるホームページを運営しておりますが、なかなか思う様に検索順位が上がってくれません。 トップページには、画像が順番に変化する仕組みを組み込んでいますが、こういう動くページは検索順位に悪影響を及ぼすものなのでしょうか? ぜひ、ご教授下さい。

    • 締切済み
    • SEO
  • R体、L体を区別する際の優先順位の付け方

    こんにちは。大学の有機化学分野の立体異性体のところでつまずいております。お詳しい方、是非ご教授をお願いします。 R体、L体の区別の方法なんですけど、 不正炭素に結合しているそれぞれの原子(団)に優先順位を付け、優先順位の一番低いものを一番遠くに置き、順位の高いものから辿っていく際に回転が右回りならばR体、左回りならばL体と区別するということは理解できました。 順位の決め方は、まずは原子番号の大きいもの順に順位をつけ、原子番号が同じだった場合はその原子に付く原子同士を比べるということだったと思いますが、 たとえばそこに二重結合が付いたり、その先が環状になっていた場合はどのように優先順位をつけてやればよいのでしょうか。 説明が下手ですいません。 具体的にいいますと、 キニーネの3位の不斉炭素には (1) ―H (2) ―C=C (3) ―CH―CH2     |    |    CH2  CH2    |     |    CH(R)―N         | (4) ――――CH2 が付いてますが、 ここで ・(1)の水素が最低順位になる。 ・最高順位は一番最初にNの現れる(4) まではわかりますが、 (2)(3)はどちらが優先順位が高いのでしょうか。