为什么java需要双等号?

时间:2013-05-16 02:08:14

标签: java

为什么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语句中为变量分配一个新值(如果有,请提供示例)?

这似乎是一个应该已经有答案的问题,但我无法在这里找到一个或使用谷歌,如果这是一个重复的问题,请告诉我,我会立即将其删除。

8 个答案:

答案 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:

  • Fortran使用=
  • Algol介绍:=进行分配,并使用=进行比较。这是解决语法歧义所必需的。
  • Pascal紧随其后。
  • PL / 1没有。
  • 我不能代表B或BCPL,但是当我们得到C时,=用于分配,==用于比较,再次解决语法歧义
  • C ++跟着C
  • Java在很多方面都遵循C ++,包括这个。

由于允许在表达式中进行赋值,因此出现语法歧义。与您的断言相反,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

虽然其他类型无法使用此语法进行编译,booleanBoolean会这样做,因此建议使用以下模式:

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返回一个布尔值;但它没有意义,因为!=语句已经返回一个布尔值。