Java:同时设置值和检查条件

sov*_*ova 2 java

(在编写原始问题的过程中,我回答了问题,但这些信息可能对其他人有用,我想到了一个新问题)

例如:

int x;
if (x = 5) { ... }
Run Code Online (Sandbox Code Playgroud)

创建错误:
类型不匹配:无法从int转换为布尔值.(因为赋值不返回
布尔值)

然而,

int x; 
if ((x = 5) == 5) { 
    System.out.println("hi!");
}
Run Code Online (Sandbox Code Playgroud)

将打印出"嗨!"

同样地,

String myString = "";
if ((myString = "cheese").equals("cheese")) {
    System.out.println(myString);
}
Run Code Online (Sandbox Code Playgroud)

打印出"奶酪"

可悲的是,

if ((int x = 5) > 2) { ... }
Run Code Online (Sandbox Code Playgroud)

不适用于在线声明.怎么会?我可以解决这个问题吗?

Ste*_*n C 6

可悲的是,

我怀疑大多数Java开发人员会非常不同意这种情绪......

if ((int x = 5) > 2) { ... }
Run Code Online (Sandbox Code Playgroud)

不适用于在线声明.怎么会?

它不起作用,因为声明不是Java表达式,并且不能在Java表达式中使用.

为什么Java设计者不允许这样做?我怀疑它是以下的组合:

  • Java的语法起源是c和C++,你也不能在C或C++中这样做,
  • 这会使Java语法更复杂,语法更难理解,
  • 这样可以更容易地用Java编写模糊/含糊的程序,这违背了设计目标,并且
  • 这是不必要的,因为你可以用更简单的方式做同样的事情.例如,您的示例可以重写此示例以声明x单独的语句.

我可以解决这个问题吗?

并非没有x在前面的声明中声明; 往上看.

(对于它的价值,大多数Java开发人员都避免使用赋值作为表达式.你很少看到这样的代码:

int x = ...;
...
if ((x = computation()) > 2) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

Java文化倾向于使用清晰/简单的代码而非巧妙的黑客攻击,旨在用最少的代码行表达某些内容.)