8

ifjava - 为什么在比较语句中的整数时需要双等号(==) ?

例如

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

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

4

8 回答 8

10

如果=有时进行分配,有时进行比较,这取决于您在哪个上下文中使用它,这不会令人困惑吗?

这听起来是个坏主意,并且会引入错误。

另外,目前的语法兼容 C 和 C++,所以很多人都熟悉它。

是否有任何理由有人想在 if 语句中将变量作为新值(如果是,请提供示例)?

while这在循环中很常见:

int b;
while ((b=in.read()) != -1){
于 2013-05-16T02:10:34.310 回答
3
= 

用于赋值。

== 

用于比较。

是否允许在 if 语句中为变量赋值(或启动新变量)?

是的,这是允许的。

于 2013-05-16T02:14:52.853 回答
1

请注意您收到的错误消息if (x = 3.141);这是一个类型错误(无法从 转换doubleboolean)。

赋值的类型是它两边的类型;如果赋值的类型是布尔型(if (x = true),甚至if (x = a.equals(b))),那么写是合法的。

因此,由于在条件中为 a 赋值是合法的boolean,因此您必须==用于比较。

于 2013-05-16T02:10:41.117 回答
1

是否甚至允许在 if 语句中将变量作为值(或启动新变量)?

是的。这样做的一个常见习惯用法是:

String line = null;
while ( (line = in.readLine()) != null ) {
  // do work
}

在循环中, line 被分配一个值,然后与 null 进行比较。我想不出整数的例子;那里肯定不清楚。

于 2013-05-16T02:11:19.527 回答
1

编程语言的历史 101:

  • Fortran=两者都使用。
  • Algol:=用于分配和=比较。这是解决语法歧义所必需的。
  • 帕斯卡紧随其后。
  • PL/1 没有。
  • 我不能代表 B 或 BCPL,但当我们得到 C 时,它是=为了分配和==比较,再次解决语法歧义
  • C++ 跟随 C
  • Java 在很多方面都跟随着 C++,包括这一方面。

由于允许在表达式中进行赋值,因此会出现语法歧义。与您的断言相反,如果是 boolean 类型if (x = true),则在 Java 中是合法的。x

于 2013-05-16T02:21:56.863 回答
1

==是身份比较器,它适用于对象和原语。它回答了“这两件事是同一件事”的问题。

=是赋值运算符。它将左侧的值设置为右侧。

将示例与布尔值一起使用时,事情可能会变得错误:

boolean b;

if (b = true) // This compiles, but is a bug, because it sets b, not tests it

虽然其他类型不会使用此语法进行编译,但boolean会这样做Boolean,这就是建议使用以下模式的原因:

if (b)
于 2013-05-16T02:22:47.607 回答
0

您绝对可以在 if 语句中分配一个变量。而且,这就是它的工作方式:=总是分配,==总是比较。

于 2013-05-16T02:11:59.877 回答
0

所以..

=是赋值,==是比较,不管用在什么地方,都是这样。

并且分配与“声明”不同。赋值语句有返回值,而声明没有。所以不能写boolean a = false()of if 语句中,但是可以a = false在 a 之前声明过的时候写。

并非所有的分配都是合法的。例如:

int index;
if (index = str.indexOf("something")) {
    ...
}

这是不合法的,因为String.indexOf(String)返回一个 int,而if需要一个布尔值。

此外, “合法”合理”之间存在巨大差异。

int index;
if ((index = str.indexOf("something")) != -1) {
    ...
}

这是合法的,因为!=操作返回一个布尔值,这是有道理的,因为我确实想检查 str 是否包含子字符串“某物”;

然而,

int index;
boolean flag;
if ( flag = ((index = str.indexOf("something")) != -1) ) {
    ...
}

也是合法的,因为 as last 的语句返回一个布尔值;但它没有意义,因为该!=语句已经返回一个布尔值。

于 2013-05-16T02:44:18.080 回答