2011-01-10 16 views
7

ポスト/プリフィックスを/ decrementに書いて、ポスト/プレフィックスのin/decrementを書こうとすると、次のエラーが発生します。オペレーションの無効な引数++/-Javaでは、なぜi ++++または(i ++)++を書くことができないのですか?

しかし、JLSによると:

PostIncrementExpression: 
     PostfixExpression ++ 

PostfixExpression: 
     Primary 
     ExpressionName 
     PostIncrementExpression 
     PostDecrementExpression 

そう書い:

PostfixExpression ++ ++ 

が可能でなければなりません...任意の考えは?

+4

「i ++」は何を返しますか? –

+5

' - ++ ---- ++ var ++ ---- ++ - ++'がちょっと混乱しているとは思わない? – Crozin

+3

C++のインクリメントがC#の場合、 'i#'を使ってみましたか? ;-) –

答えて

23

注意をループを使用します。それは単なる構文であり、構文上有効なプログラムはすべて一般的に有効であるとは限りません。たとえば、使用する前に変数を宣言しなければならないという要件は、通常、文法でカバーされません(ただし、面倒です)。

Postfix-incrementは右値を返します。後置増数値のリテラルと同じように、i++の結果を後置増数値にすることはできません。 JLSから引用

(3 RD編、ページ486。):

The result of the postfix increment expression is not a variable, but a value.

+0

使用前の宣言を文法にエンコードすることはできますか?任意の数の識別子に対して – delnan

+0

@delnan:Van Wijngaarden文法はそういうもののために考えられました。しかし、実際のところ、2レベルの文法は扱いにくく、ASTに伝播するアサーションを定義する単純な帰属文法でも同じことを達成することができます(正しくリコールすれば、そのクラスから数年経っています)。 – Joey

0

あなたは(i ++)++で何を達成しようとしていますか?

2回増やす!

ループ内

インクリメント:)生の文法はどんな意味を欠いていること

+3

ugghh。確かに 'i + = 2'はループより優れています。 –

1

、このような操作の結果がどうあるべきか? i++の結果は、現在値iのコピーであり、iは、その後にインクリメントされます(投稿)。だから、もう一度i++の結果を増やすことは想像できますか? iが元々1だった場合、その値はi++++の後になるはずです。この操作の結果はどうなりますか?

これについて考えてみると、非常にであることが分かります。 Javaの設計者は、C/C++の「未定義」トラップを避けることを意図していたため、このような記述の価値は疑いの余地があるため、明示的に禁止することにしました。オペレータは、変数を必要とする

unexpected type 
required: variable 
found : value 
     (i++)++; 

だから、私は++値に評価:

+0

いいえ、そうではありません。その理由は、他の回答に記載されているように、式i ++の結果が値であり、変更可能な参照ではないためです。 –

+0

@ジョン、あなたの質問のポイントは何でしたか? –

+0

私はコメント/回答のためにそれを思い出しました。 –

8

エラーがあなたに答えを伝えます。

+2

ええ、コンパイラに依存しています。 EclipseCは次のような結果を返します。»操作++/- の引数が無効です。 – Joey

+0

興味深い。そうです、それはそれほど有用ではありません。上記のエラーは、Sunコンパイラからのものです。 – JOTN

5

++または--は、変更可能な位置(左辺)を表す式にのみ適用できます。 ++または--のRESULTは、場所からの値です(値は増分または減分の前後)。変更可能な場所ではありません。だから、(a+b)++と言うことができる以上、(a++)++と言うことはできません。変更する場所はありません。

0

++では、++は後置演算子であるため、iの値を返してからインクリメントします。あなたは何をしたいですか? (i ++ == i)からi + 1を返すべきか? !

i++ == i; // true 
j = i++ // j gets the value of i 
j++ == i // still true since j== i 

(i++) ++ == j ++ // what should be the answer here? 

あなたは私+ = 2考えがあります:いない場合は、それは私が++ =私が、は、(i ++は)++ = i)は次の式を考慮することを奇妙なのではないでしょうか?

2

基本的にするためのショートカットです++ I:

(私は= I + 1)

そして、それはどんな意味がありませんように記述します

(I = I + 1)++ ;

右か? :)

+3

'(i = i + 1)'は '(i ++)'と同じ動作ではない - 前者は新しい値iを返し、後者は古い値を返す。 –

+0

申し訳ありません。私は面白さを伝える良いスマイリーを選んだわけではないと思う。私の悪い。これのために自分自身に-1。 – Kylar

0

なぜ簡略化インクリメント演算子を使用しないのですか?

i+=2 

があります。

4

この式の問題i =(i ++)++;は、(i ++)が値に解決され、++演算子の定義によれば、 となります。これは、指定された変数をインクリメントし、PostfixまたはPrefixを使用するかどうかにかかわらず、この変数を設定/返します。 2.この演算子には、接頭辞または接尾辞のいずれかの変数が必要です。しかし、ここで何が起こっているのは、(i ++)が値を返して(i ++)の代わりに入れて、(値)++(値)は、値の代わりに変数。スニペットの後に示されるように次のコードをコンパイルする場合は、Javaで例えば

は、あなたがエラーを取得しますスニペット:

パブリッククラスA { ます。public voidテスト(){ のint i = 0; i =(i ++)++; }}

コンパイル出力:

A.java:4:予期しないタイプ 必須:変数 が見つかりました:値 i =(i ++)++; ^ 1エラー

1

は覚えておく必要があります:インクリメント&デクリメント(接頭&後置)演算子は、常にここで私は1つのexeファイルでこれを説明しています変数ない

と連携します:

int i = 0; 

int j = (i++)++; 

exe。

initialize value of i with 0(zero)

in (i++) '++' work with i which is variable & after performing operation return (1)

now in (1)++ '++' work with (1) which is value not variable that is oppose to rules of java that's why compile time error generate Invalid argument to operation ++/--

関連する問題