Javaでは、なぜI ++++または(I ++)++を書くことができないのですか?

StackOverflow https://stackoverflow.com/questions/4651615

  •  09-10-2019
  •  | 
  •  

質問

Postfix/prefix in/decrementを作成しようとしてから、Post/Prefix in/Decrentを作成しようとすると、次のエラーが表示されます。 Operation ++/ - への無効な議論.

PostIncrementExpression:
        PostfixExpression ++

PostfixExpression:
        Primary
        ExpressionName
        PostIncrementExpression
        PostDecrementExpression

だから書く:

PostfixExpression ++ ++

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

役に立ちましたか?

解決

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

フィックスインクレメント後のrvalueはrvalueを生成します。フィックスインクリメントのリテラルを投稿できないのと同じように、フィックスインクリメントを投稿することはできません。 i++.

JLSから引用(3rd ed。、486ページ):

フィックス後の増分式の結果は変数ではなく、値です。

他のヒント

エラーは答えを教えてくれます:

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

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

適用することしかできません ++ また -- 変更可能な場所(lvalue)を示す式に。の結果 ++ また -- 場所からの値(RValue -incrementまたはdecrementの前または減少の後のいずれか)であり、それ自体が変更可能な場所ではありません。だからあなたは言うことができません (a++)++ あなたが言うことができる以上に (a+b)++ - 変更する場所はありません。

この表現の問題 i =(i ++)++; (i ++)は値との定義に解決されますか ++ オペレーターはそれを言います1 . 指定された変数が増加し、PostfixまたはPrefixを使用するかどうかにかかわらず、この値を配置/返します。2. この演算子は、プレフィックスまたはポストフィックスのいずれにおいても変数が必要です。しかし、ここで起こっているのは(i ++)は値を返し、(i ++)の代わりにそれを置くことであり、それからあなたは持っていることです (値)++(価値) 価値の代わりに変数が必要なため、この演算子には期待されるタイプではありません。

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

パブリッククラスA {public void test(){int i = 0; i =(i ++)++; }}

コンパイル出力:

A.Java:4:予期しないタイプが必要です:変数fund:value i =(i ++)++; ^ 1エラー

I ++は基本的に:

(i = i+1)

そして、書くのは意味がありません:

(i = i+1)++;

右? :)

そのような操作の結果は何ですか?結果として i++ の現在の値です(のコピー) i, 、 と i その後増加します(役職)。では、結果を増やすことをどのように想像しますか i++ もう一度?もしも i もともとは1でした、その価値は何を後にするべきですか i++++, 、そして、この操作の結果は何ですか?

あなたがそれについて考えるなら、あなたはおそらくそれがそうなることに気付くでしょう 非常に これを適切に定義するのは困難です。 Javaの設計者は、C/C ++の「未定義の」トラップを避けるつもりだったため(そしてそのような声明の価値はせいぜい疑わしいので)、彼らはおそらくそれを明示的に禁止することにしたでしょう。

覚えておく必要があります: Increment&Dectrent(prefix&postfix)オペレーターは常に一緒に動作します 変数 いいえ 価値

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

int i = 0;

int j = (i++)++;

上のexe。

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

(i ++) '++'操作は可変であり、操作リターンの実行後 (1)

(1)++ '++'は(1)javaのルールに反対する変数ではない値ではない(1)で動作します。これがタイムエラー生成をコンパイルする理由です Operation ++/ - への無効な議論

(i ++)++によって何を達成しようとしているのですか?

それを2回増やします!!

ループを使用します

ループ内の増分:)

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を検討しましたか?

速記の増分演算子だけを使用してみませんか?

i+=2

三。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top