7

ポストフィックス/プレフィックスイン/デクリメントを書き込もうとした後、ポスト/プレフィックスイン/デクリメントを書き込もうとすると、次のエラーが発生します。操作の引数が無効です++/--

しかし、JLSによると:

PostIncrementExpression:
        PostfixExpression ++

PostfixExpression:
        Primary
        ExpressionName
        PostIncrementExpression
        PostDecrementExpression

だから書く:

PostfixExpression ++ ++

可能であるはずです...何か考えはありますか?

4

10 に答える 10

23

生の文法にはセマンティクスがないことに注意してください。これは単なる構文であり、構文的に有効なすべてのプログラムが一般的に有効であるとは限りません。たとえば、使用前に変数を宣言する必要があるという要件は、通常、文法ではカバーされていません(できますが、面倒です)。

Postfix-incrementは右辺値を生成します–そして、postfix-incrementリテラルができないのと同じように、の結果をpostfix-incrementすることはできませんi++

JLSからの引用(第3、486ページ):

後置インクリメント式の結果は変数ではなく、値です。

于 2011-01-10T21:22:57.507 に答える
8

エラーはあなたに答えを教えてくれます:

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

したがって、i ++は値に評価されますが、演算子には変数が必要です。

于 2011-01-10T21:23:54.247 に答える
5

++または--を変更可能な場所(左辺値)を示す式にのみ適用できます。++またはの結果は--、場所からの値(右辺値-インクリメントまたはデクリメントの前または後)であり、それ自体は変更可能な場所ではありません。ですから、あなたが(a++)++言うことができる以上のことを言うことはできません(a+b)++-変更される場所はありません。

于 2011-01-10T21:25:35.963 に答える
4

この式の問題i=(i ++)++; (i ++)が値に解決され、++演算子の定義が1と言っていること です。指定された変数をインクリメントし、PostfixまたはPrefixのどちらを使用する場合でも、この値を入力/返します。 2.この演算子には、接頭辞か接尾辞かに関係なく変数が必要です。しかし、ここで起こっているのは、(i ++)が値を返し、(i ++)の代わりにそれを配置することです。次に、(value)++が あり、(value)は、変数を配置する必要があるため、この演算子に期待される型ではありません。価値の。

たとえば、Javaで次のコードスニペットをコンパイルすると、スニペットの後に示されているようにエラーが発生します。

public class A {public void test(){int i = 0; i =(i ++)++; }}

コンパイル出力:

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

于 2013-07-23T13:44:28.093 に答える
2

i++は基本的に次のショートカットです。

(i = i + 1)

そして、次のように書くのは意味がありません。

(i = i + 1)++;

右?:)

于 2011-01-10T21:30:57.357 に答える
1

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

あなたがそれについて考えるならば、あなたはおそらくこれを適切に定義することは非常に難しいだろうと気付くでしょう。Javaの設計者は、C / C ++の「未定義」トラップを回避することを意図していたため(そして、そのようなステートメントの値はせいぜい疑わしいため)、おそらく明示的に禁止することにしました。

于 2011-01-10T21:23:46.413 に答える
1

覚えておくべきこと:インクリメント&デクリメント(プレフィックス&ポストフィックス)演算子は常にではなく変数で機能します

ここで私は1つのexeファイルでこれを説明しています:

int i = 0;

int j = (i++)++;

上記のexeファイル。

iの値を0(ゼロ)で初期化します

in (i ++) '++'は可変であるiで動作し、操作を実行した後return (1)

現在(1)++で'​​++'は(1)で動作します。これは、Javaのルールに反する変数ではない値であるため、コンパイル時エラーが生成されます。操作に対する無効な引数+ +/--

于 2015-04-06T12:59:11.083 に答える
0

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

2回インクリメント!!

ループを使用する

ループ内でインクリメント:)

于 2011-01-10T21:22:49.413 に答える
0

i ++では、++は接尾辞演算子であるため、iの値を返し、それをインクリメントします。(i ++)++で何をしたいですか?(i ++ == i)なので、i + 1を返す必要がありますか?i ++ = iであるが、(i ++)++!= i)であることが不思議ではない場合は、次の式を検討してください。

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?

i + = 2を検討しましたか?

于 2011-01-10T21:29:39.403 に答える
0

省略形のインクリメント演算子を使用してみませんか?

i+=2

三。

于 2011-07-13T20:01:58.297 に答える