Java - for 循环声明外的逗号运算符
Posted
技术标签:
【中文标题】Java - for 循环声明外的逗号运算符【英文标题】:Java - comma operator outside for loop declaration 【发布时间】:2012-09-18 01:42:27 【问题描述】:我知道我可以像这样使用逗号运算符
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://***.com/a/12047433/1084813
对于代码混淆竞赛或混淆我的同事来说,这将是一个巧妙的技巧,但两个示例都无法编译(Java 1.6,Eclipse Juno),错误是“分配的左侧必须是多变的”。我尝试查看编译器设置以查看是否可以禁止防止错误代码,但没有运气。
怎么了?逗号运算符是否是后来更改的旧规范的一部分?编写这些示例的人是否使用允许这样做的不同 Java 设置?
【问题讨论】:
JLS 说:Unlike C and C++, the Java programming language has no comma operator. “或混淆我的同事”。大多数人试图让他们的代码更具可读性,而不是更少。 它的语法不正确,你为什么要混淆你的同事?无需额外的混淆工作,该代码将很快成为遗留代码。 混淆只是为了好玩,当然,不要用在严肃的代码中。编译器说“赋值的左边必须是变量” 别这样,可读性被搞砸了。 【参考方案1】:https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.27
15.27。表达式
<...>
与 C 和 C++ 不同,Java 编程语言没有逗号运算符。
【讨论】:
Java 有逗号分隔符。 Source : JLS @iamcreasy java 没有逗号运算符,它只有一个分隔符。在您的来源中,它是一个分隔符而不是运算符。有区别。【参考方案2】:怎么了?
在 C 中有效的一些技巧在 Java 中无效。
逗号运算符是否是后来更改的旧规范的一部分?
这在 Java AFAIK 中从未奏效。
编写这些示例的人是否使用允许这样做的不同 Java 设置?
假设 Java 与 C 或 C++ 类似,这是一个常见的错误,因为它们很相似。 SO 上的很大一部分编码错误是由于人们试图用 Java 编写 C++,但当它没有达到他们的预期时会感到困惑。
顺便说一句:我犯了同样的错误,假设 C++ 就像 Java,因为我对 C++ 的了解不是最新的。
但是一些技巧可以使用 Java,但可能不适用于 C。
您可以使用所有货币符号,也可以使用一些看起来最相同的货币符号。
例如
if( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀ || ¢ + ¢== ₡)
您可以使用不可见的字符和 c 对,在打印时反转该行其余部分的顺序。 ;)
这个程序编译并运行并打印所有你可以在 Java 标识符中使用的奇数字符
for (char ch = 0; ch < Character.MAX_VALUE; ch++)
if (Character.isJavaIdentifierPart(ch) && !Character.isJavaIdentifierStart(ch))
System.out.printf("%04x <%s>%n", (int) ch, "" + ch);
这让它几乎太容易了。
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
【讨论】:
“这对于代码混淆竞赛或混淆我的同事来说是一个巧妙的技巧,” “一些在 C 中有效的技巧在 Java 中无效。”不知道你还能说什么。 第一个例子取自一篇关于 Java 的文章,第二个例子是在关于 SO! 的 Java 相关问题下找到的。这不仅仅是我试图用 Java 编写的一些 C 代码。 @JohnEye 希望这是回答您问题的更好尝试。 @PeterLawrey 如果我在 JLS 上使用“连接字符”一词进行搜索,则没有任何显示。您在哪里找到这些信息的?以上是关于Java - for 循环声明外的逗号运算符的主要内容,如果未能解决你的问题,请参考以下文章