[解決済み] なぜ `++a++` は C++ でコンパイルできないのに `(++a)++` はコンパイルできるのですか?重複
質問
タイトルに書いてあること C++の場合。
(++a)++
はコンパイルできます。不思議なことに
++(a++)
を実行しない。
int main() {
int a = 0;
++a++; // does not compile
(++a)++; // does compile
++(a++); // does not compile
}
しかし、Javaでは、3つともそうなりません。
public class Test {
public static void main(String[] args) {
int a = 0;
++a++; // does not compile
(++a)++; // does not compile
++(a++); // does not compile
}
}
C++ではコンパイルできるのに、Javaではできないのは、何か理由があるのでしょうか?
解決方法は?
Java では、postfix と prefix の両方のインクリメント演算が、以下のような結果を返すので、どの例も動作しません。 値 ではなく 変数 にアクセスすることで確認できます。 JLS のセクションで Postfixインクリメント演算子 ++ を例に挙げて、こう書かれています。
後置インクリメント式の結果は変数ではなく、値です。
のJLSセクションは プリフィックス・インクリメント・オペレーター ++ は同じことを言う。
これは、リテラル値をインクリメントしようとするようなものである ( ライブを見る ):
2++ ;
++3 ;
を実行すると、次のようなエラーが発生します。
required: variable
found: value
これは、あなたの例で受け取ったのと同じエラーです。
C++では、prefix increment は lvalue を返しますが、postfix increment は prvalue を返し、C++では prefix と postfix increment の両方が lvalue を必要とします。というわけで、1番目と3番目の C++ の例です。
++a++;
++(a++)
は、prvalue に prefix increment を適用しようとしているため、失敗します。一方、2番目のC++の例。
(++a)++;
は、prefix increment が lvalue を返すので大丈夫です。
参考までに
C++標準草案
の項では
5.2
Postfixの表現
は言う。
後置++式の値は、そのオペランドの値である [...] オペランドは、変更可能なl値でなければならない。
とする。
その結果は、prvalue
とセクション
5.3
単項式
は言う。
接頭辞 ++ のオペランドが変更される [...] 。 オペランドは、変更可能な l 値でなければならない。
とします。
結果は更新されたオペランドであり、lvalue です。
関連
-
linux run jarfile Invalid or corrupt jarfile error.
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] Mavenが実行するJUnitテストを見つけ出せない
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java Error スレッド "AWT-EventQueue-0" で例外発生 java.lang.
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
java の例外が発生しました java
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
Methodのinvokeメソッド実装のJavaリフレクション
-
自動配線された依存性のインジェクションに失敗しました。
-
Javaエラーメッセージがenclosingクラスでない
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
スレッド "main" で例外発生 java.net.BindException: アドレスは既に使用中です。NET_Bind