(在编写原始问题的过程中,我回答了这个问题,但这些信息可能对其他人有用,我想到了一个新问题)
例如:
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) { ... }
不适用于内联声明。怎么会?我可以解决这个问题吗?
答案 0 :(得分:6)
不幸的是,
我怀疑大多数Java开发人员会非常不同意这种情绪......
if ((int x = 5) > 2) { ... }
不适用于内联 宣言。怎么会?
它不起作用,因为声明不是Java表达式,并且不能在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
不允许。