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

时间:2010-11-23 05:22:38

标签: java

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

例如:

int x;
if (x = 5) { ... }

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

然而,

int x; 
if ((x = 5) == 5) { 
    System.out.println("hi!");
}

将打印出“hi!”

同样地,

String myString = "";
if ((myString = "cheese").equals("cheese")) {
    System.out.println(myString);
}

打印出“奶酪”

不幸的是,

if ((int x = 5) > 2) { ... }

不适用于内联声明。怎么会?我可以解决这个问题吗?

7 个答案:

答案 0 :(得分:6)

  

不幸的是,

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

if ((int x = 5) > 2) { ... }
     

不适用于内联   宣言。怎么会?

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

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

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

我可以解决这个问题吗?

在前面的陈述中声明x并非如此;见上文。

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

int x = ...;
...
if ((x = computation()) > 2) {
    ...
}

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

答案 1 :(得分:1)

您的x仅存在于作业范围内,所以当您到达> 2时它已经消失了。无论如何,这有什么意义呢?您是否正在尝试编写故意不可读的代码?

解决此问题的最佳方法是在x语句中保持有效的范围内声明if。说真的,我不明白你在这做什么。为什么要创建一个应该立即消失的变量?

答案 2 :(得分:1)

if ((int x = 5) > 2) { ... }

是的,这不会编译,因为你不能在if子句的条件部分中声明变量

答案 3 :(得分:0)

只要在>条件之外声明int,if测试就可以正常工作。也许你为了简洁起见简化了你的条件,但没有理由把你的声明放在条件中。

  

我可以解决这个问题吗?

是的,声明你的var超出条件。

答案 4 :(得分:0)

因为你没有像在== test中那样单独声明int。


jcomeau@intrepid:/tmp$ cat /tmp/test.java
class test {
 public static void main(String[] args) {
  int x;
  if ((x = 5) > 2) System.out.println("OK");
 }
}

答案 5 :(得分:0)

在Java中,for()允许初始化代码,但if()不允许。

答案 6 :(得分:0)

您无法在条件部分声明变量。例如

for(int i = 0; j < 9; i++){...}

是完全有效的陈述。注意我们在for中声明了变量,但是在条件子句中没有声明,现在看看这个,

for(int i = 0; (int j = 0)<9; i++){...} // Don't try to make logical sense out of it

不允许。