为什么java在if
语句中比较整数时需要双等号(==)?
例如
if(x = 3.141)
System.out.println("x is equal to pi.");
不正确,应该是
if(x == 3.141)
System.out.println("x is equal to pi.");
我知道“==”用于比较整数,“=”用于设置整数值,但为什么在if
语句中这仍然是真的?
是否允许在 if语句(或启动新变量)中为变量赋值?
有没有理由让任何人想要在if
语句中为变量分配一个新值(如果有,请提供示例)?
这似乎是一个应该已经有答案的问题,但我无法在这里找到一个或使用谷歌,如果这是一个重复的问题,请告诉我,我会立即将其删除。
答案 0 :(得分:10)
如果=
有时会进行分配,有时会进行比较,这取决于您使用它的上下文,这不会令人困惑吗?
这听起来不错,会引入错误。
另外,目前的语法与C和C ++兼容,所以很多人都熟悉它。
有没有理由让任何人想要在if语句中为变量赋一个新值(如果有,请提供一个例子)?
在while
循环中很常见:
int b;
while ((b=in.read()) != -1){
答案 1 :(得分:1)
注意您为if (x = 3.141)
收到的错误消息;它是类型错误(无法从double
转换为boolean
)。
作业的类型是其双方的类型;如果赋值的类型是布尔值(if (x = true)
,甚至是if (x = a.equals(b))
),那么写入是合法的。
因此,在条件中为boolean
分配值是合法的,您必须使用==
进行比较。
答案 2 :(得分:1)
是否允许在if语句中为变量赋值(或启动新变量)?
是。这样做的一个常见习语是:
String line = null;
while ( (line = in.readLine()) != null ) {
// do work
}
在循环中,为行分配一个值,然后将其与null进行比较。我想不出有一个关于int的例子;它当然不会很清楚。
答案 3 :(得分:1)
=
用于作业。
==
用于比较。
是否允许在if语句中为变量赋值(或启动新变量)?
是的,这是允许的。
答案 4 :(得分:1)
编程语言的历史101:
=
。:=
进行分配,并使用=
进行比较。这是解决语法歧义所必需的。=
用于分配,==
用于比较,再次解决语法歧义由于允许在表达式中进行赋值,因此出现语法歧义。与您的断言相反,if (x = true)
在Java 中是合法的,如果x
的类型为布尔值。
答案 5 :(得分:1)
==
是身份比较器,适用于对象和基元。它回答了“两件事情相同事情”的问题。
=
是赋值运算符。它将左侧的值设置为右侧。
在使用布尔值的例子时,事情会变得越来越麻烦:
boolean b;
if (b = true) // This compiles, but is a bug, because it sets b, not tests it
虽然其他类型无法使用此语法进行编译,boolean
和Boolean
会这样做,因此建议使用以下模式:
if (b)
答案 6 :(得分:0)
你绝对可以在if语句中分配一个变量。另外,这就是它的工作方式:=
始终是作业,而==
始终是比较。
答案 7 :(得分:0)
所以..
=
是作业,而==
是比较,无论在何处使用,它总是如此。
分配与“声明”不同。赋值语句具有返回值,而声明则没有。因此,您无法在if语句的boolean a = false
中编写()
,但在之前声明之后可以编写a = false
。
并非所有作业都是合法的。例如:
int index;
if (index = str.indexOf("something")) {
...
}
这不合法,因为String.indexOf(String)
返回一个int,而if
需要一个布尔值。
此外,“合法”与“有道理”之间存在巨大差异。
int index;
if ((index = str.indexOf("something")) != -1) {
...
}
这是合法的,因为!=
操作返回一个布尔值,这是有意义的,因为我想检查str是否包含子串“something”;
然而,
int index;
boolean flag;
if ( flag = ((index = str.indexOf("something")) != -1) ) {
...
}
也是合法的,因为语句作为last返回一个布尔值;但它没有意义,因为!=
语句已经返回一个布尔值。