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 中无效。

逗号运算符是否是后来更改的旧规范的一部分?

这在 Java AFAIK 中从未奏效。

编写这些示例的人是否使用允许这样做的不同 Java 设置?

假设 Java 就像 C 或 C++ 一样,这是一个常见的错误,因为它们很相似。SO 上的很大一部分编码错误是由于人们试图用 Java 编写 C++ 并且当它没有达到他们的预期时感到困惑。

顺便说一句:假设 C++ 就像 Java 一样,我犯了同样的错误,因为我对 C++ 的了解不是最新的。


然而,一些适用于 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 回答