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 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

【讨论】:

“这对于代码混淆竞赛或混淆我的同事来说是一个巧妙的技巧,” “一些在 C 中有效的技巧在 Java 中无效。”不知道你还能说什么。 第一个例子取自一篇关于 Java 的文章,第二个例子是在关于 SO! 的 Java 相关问题下找到的。这不仅仅是我试图用 Java 编写的一些 C 代码。 @JohnEye 希望这是回答您问题的更好尝试。 @PeterLawrey 如果我在 JLS 上使用“连接字符”一词进行搜索,则没有任何显示。您在哪里找到这些信息的?

以上是关于Java - for 循环声明外的逗号运算符的主要内容,如果未能解决你的问题,请参考以下文章

FOR循环中的逗号运算符,它是如何工作的?

用逗号运算符做 while ( , ) ,这可能吗?

逗号运算符do while循环嵌套循环数组简介

如何提高循环效率

r闪亮ui中for循环内的逗号

逗号分隔的表达式作为 for 循环中的条件如何工作?