8

私はこのようにコンマ演算子を使用できることを知っています

for (int i = 1, j = 15; j>10; i++, j--) {
    // do something neat
}

しかし、いくつかの記事は、コンマ演算子をforループ宣言の外で使用できることを示唆しているようです。

int j = 2, k = 4 ;
int x ;
// Assignment statement with comma operator
x = j + 1, k ;

ソース:http ://www.cs.umd.edu/~clin/MoreJava/ControlFlow/comma.html

また

int x = (expression) ? (i++,2) : 3;

ソース:https ://stackoverflow.com/a/12047433/1084813

これは、コード難読化コンテストや同僚を混乱させるための巧妙なトリックですが、どちらの例もコンパイルされません(Java 1.6、Eclipse Juno)。エラーは「割り当ての左側は変数でなければなりません」です。コンパイラの設定を調べて、不正なコードを防ぐために禁止できるかどうかを確認しましたが、運が悪かったのです。

どうしたの?コンマ演算子は、後で変更された古い仕様の一部でしたか?これらの例を書いた人々は、これを可能にする別のJavaセットアップを使用していますか?

4

2 に答える 2

12

https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.27

15.27. 表現

<...>

C や C++ とは異なり、Java プログラミング言語にはコンマ演算子がありません。

于 2013-12-10T05:23:07.437 に答える
8

どうしたの?

Cで機能するトリックのいくつかは、Javaでは機能しません。

コンマ演算子は、後で変更された古い仕様の一部でしたか?

これはJavaAFAIKでは機能しませんでした。

これらの例を書いた人々は、これを可能にする別のJavaセットアップを使用していますか?

Javaは類似しているため、CまたはC++と同じであると想定するのはよくある間違いです。SOでのコーディングミスの大部分は、JavaでC ++を書き込もうとして、期待どおりに機能しない場合に混乱することが原因です。

ところで:C ++に関する私の知識は最新ではないので、C ++がJavaと同じであると仮定して、同じ間違いを犯しました。


ただし、Javaは機能するが、Cは機能しないトリックがいくつかあります。

すべての通貨記号を使用することも、ほとんど同じように見える通貨記号をいくつか使用することもできます。

例えば

if( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀ || ¢ + ¢== ₡)

見えない文字と、印刷時に残りの行の順序を逆にするcカップルを使用できます。;)

このプログラムは、Java識別子で使用できるすべての奇数文字をコンパイルして実行し、出力します。

for (char c‮h = 0; c‮h < Character.MAX_VALUE; c‮h++)
    if (Character.isJavaIdentifierPart(c‮h) && !Character.isJavaIdentifierStart(c‮h))
        System.out.printf("%04x <%s>%n", (int) c‮h, "" + c‮h);

これはほとんど簡単すぎます。

http://vanillajava.blogspot.co.uk/2012/08/uses-for-special-characters-in-java-code.html

http://vanillajava.blogspot.co.uk/2012/09/hidden-code.html

于 2012-09-26T12:28:25.417 に答える