R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

インクリメント演算子を前後に置いたときの優先順位

http://msdn.microsoft.com/ja-jp/library/aa691323.aspx
7.2.1 演算子の優先順位と結合規則

先日、確認したいことがあって演算子の優先順位を調べていて見つけたんですけど、前置インクリメント演算子と後置インクリメント演算子では

後置インクリメント演算子の方が優先順位が高い

のね~

何か変なの、と思って調べてみたいんだけど、どうやって動作を確認すれば良いのか見当がつかない orz

ちなみに、「++i;」と書いた場合と「i++;」と書いた場合の動作の違いなら、以下のようにすれば簡単に検証できる。


var a = 0;
var b = 0;
Console.WriteLine(++a); // 1 と表示
Console.WriteLine(b++); // 0 と表示


前置演算と後置演算の優先順位の動作検証ってできるんだろうか?

で、ついでに言うと、この優先順位が生きる時って、どんな時なんだろう?

まー、記述されている内容を見る限りだと、後置インクリメント(デクリメント)演算子は、基本式だからという理由らしいけど・・・

投稿日時 : 2009年6月8日 15:02

Feedback

# re: インクリメント演算子を前後に置いたときの優先順位 2009/06/08 15:14 aetos

個人的には前置しか使いません。
かつ、for の場合を除いて、単独で文となるように使います。

# re: インクリメント演算子を前後に置いたときの優先順位 2009/06/08 15:36 K5

私も前置しか使わないな~
基本的には前置のほうが処理早い&意味合いに動作が近いし。

aetosさんと同じく単独でしか使わないようにしてます。
目的としては前置と後置を書き換えても動作が変わらないようにって感じですが。
#以前規約がどうとかで勝手に書き換えられてバグになったことがあるので…つーか違いぐらい理解しとけよorz

# re: インクリメント演算子を前後に置いたときの優先順位 2009/06/08 17:03 biac

ぬぅぅ… 難し~ orz

--i++;
って書くと、 コンパイラさまは↓こう怒ってくるですよ。
http://msdn.microsoft.com/ja-jp/library/bb310865.aspx
/*
コンパイラ エラー CS1059
インクリメント演算子またはデクリメント演算子のオペランドには、変数、プロパティ、またはインデクサを指定してください。
*/
これはすなわち、
--(i++);
と解釈したので、 -- のオペランドが式になっちゃった、 ってことで、 つまり後置インクリメントが優先されてる …で、 ダメっすか? f(^^;

# re: インクリメント演算子を前後に置いたときの優先順位 2009/06/08 18:32 Jitta

biac先生!
(--i)++; との違いは?

# re: インクリメント演算子を前後に置いたときの優先順位 2009/06/08 18:48 biac

> (--i)++; との違いは?

が~ん… orz
おんなじ怒られ方をするよぉ~ (;;)

ってことで、 撤回。 検証のやり方が、 私にはわかんねーっす f(^^;

int f() { return 1; }
void test() {
 --f();
 f()++;
}
とか書いても、 同じ怒られ方するし~ orz
# C# コンパイラ、エラーメッセージの手抜きだ! (w

# re: インクリメント演算子を前後に置いたときの優先順位 2009/06/08 21:15 刈歩 菜良 CTP

正解は<del>越後製菓</del>
インクリメント/デクリメント演算子を式とかに混ぜて使っちゃだめ~~~ です。
シャノンさんがいうように、単独式でしか使いません。

その場合、前置も後置も関係ないのでどちらでもOKかと。

可読性第一です。


ちなみに、前置後置で違いがあることすら教えません。
# C++経験者がまれにいて質問を受けることもありますが、その場合も単独で使うように説明します。

# re: インクリメント演算子を前後に置いたときの優先順位 2009/06/09 11:51 aetos

なんか違和感がある。

int i = ++x; の場合、++x の式の値は x + 1 です。
int i = x++; の場合、x++ の式の値は x です?

C# の言語仕様では、代入 = の優先順位は最低です。
なので、前置の場合は、まず優先順位の高い ++x が行われ、続いて = が行われます。
後置の場合は? なんだか i = x が先に行われ、後で x++ が行われているようにも見えます。

式の値の決定のタイミングを考えると、前置でも後置でも = より先です。
前置は言うに及ばず、後置は、式の値を x と決定してから代入が行われています。加算は代入の前でも後でも構いません(既に式の値は決定しているので、代入の結果は変化しません)。

うーん? 関係あるようなないような?

# インクリメント演算子を前後に置いたときの優先順位(その2) 2009/06/09 14:06 R.Tanaka.Ichiro's Blog

インクリメント演算子を前後に置いたときの優先順位(その2)

# インクリメント演算子を前後に置いたときの優先順位(その2) 2009/06/09 14:08 R.Tanaka.Ichiro's Blog

インクリメント演算子を前後に置いたときの優先順位(その2)

タイトル  
名前  
Url
コメント