Java - 用于循环声明的逗号运算符

时间:2012-09-26 12:19:47

标签: java for-loop variable-assignment assignment-operator comma-operator

我知道我可以像这样使用逗号运算符

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设置编写这些示例的人是否允许这样做?

2 个答案:

答案 0 :(得分:12)

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

  

<强> 15.27。表达

     

&LT; ...&GT;

     

与C和C ++不同,Java编程语言没有逗号运算符。

答案 1 :(得分:7)

  

怎么了?

在C中工作的一些技巧在Java中不起作用。

  

逗号运算符是旧规范的一部分,后来又改变了吗?

这在Java AFAIK中从未奏效。

  

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

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

BTW:我犯了同样的错误,假设C ++和Java一样,因为我对C ++的了解不是最新的。


然而,一些使用Java但可能不是C的技巧。

您可以使用所有货币符号,也可以使用几个看起来最相符的货币符号。

e.g。

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