'=='和'='之间有什么区别?

时间:2009-06-17 14:07:23

标签: java operators

我知道其中一个是按位而另一个是合乎逻辑的,但我无法弄明白:

Scanner sc = new Scanner(System.in);
System.out.println("Enter ur integer");
int x=sc.nextInt();
if(x=0)//Error...it can not be converted from int to boolean
System.out.println("...");

错误表示x无法转换为boolean,或x=0的结果无法转换为boolean

12 个答案:

答案 0 :(得分:23)

==检查是否相等。 =是作业。

您正在做的是: if( x = Blah ) - 在Java中,此语句是非法的,因为您无法测试赋值语句的状态。具体来说,Java不会将赋值视为布尔运算,这在if语句中是必需的。这与C / C ++形成对比,C / C ++允许您将赋值视为布尔运算,并且可能是许多令人毛骨悚然的错误的结果。

答案 1 :(得分:13)

当您写'x = 0'时,您说的是“在变量x中存储0”。整个表达式的返回值为'0'(就像这样,你可以说愚蠢的东西,比如x = y = 0)。

当你写'x == 0'时,它会说“x是否等于0?”。此表达式的返回值将为“true”或“false”。

在Java中,你不能只说if(0)因为如果需要一个真/假的答案。所以把if(x = 0)不正确,但是如果(x == 0)没问题。

答案 2 :(得分:5)

==是比较运算符,=是赋值。

答案 3 :(得分:4)

== is an equality check. if (x == 0) // if x equals 0
= is an assignment. x = 0; // the value of x is now 0

答案 4 :(得分:2)

我知道问题已得到解答,但这仍然不时出现程序员错误,而是作为一个印刷错误(即程序员知道他的意思,但失败了)。这很难看,因为两者看起来很相似。

我发现一种帮助避免这样做的方法是将常量表达式放在左侧,如下所示:

if (0 == x) 
   ...

这样,如果我不小心只使用了一个“=”符号,编译器就会因为分配给常量表达式而失败,无论赋值运算符是否为左关联,if条件是否需要强 - 键入布尔值。

答案 5 :(得分:1)

if(x=0)

这里你为变量x分配值0。 Java中的if语句无法像许多其他语言一样评估整数参数。在Java中,如果需要布尔值。尝试

if(x == 0)

进行比较

答案 6 :(得分:1)

将错误解释为

“表达式

x=0

无法转换为布尔值。“

答案 7 :(得分:1)

只是为了澄清C / C ++ - 赋值被评估为右操作数

if(a = n)

被评估为n,因此(n = 1)为真(n = 0)为假

答案 8 :(得分:1)

一个有趣的注意事项:由于赋值运算符求值为右操作数,因此以下内容在Java中有效(尽管不是很漂亮):

if (( x = blah ) > 0) ...

由于运算符优先级('>'绑定强于'='),因此需要使用括号。

答案 9 :(得分:0)

正如其他人已经说过的,'='是指定; '=='是比较。

在您的计划更改中

  

如果(X = 0)

  

如果(X == 0)

答案 10 :(得分:0)

"==" checks for equality



"=" Is used for assignment. 

它给你错误,因为你在if()中为x赋值,你应该检查是否相等。尝试将其更改为相等而不是赋值运算符。

答案 11 :(得分:0)

正如其他人所说,===比较时分配。

但是,这些陈述也有自己的价值。

=运算符返回其右侧操作数的值。这就是a = b = c = 5这样的语句的工作原理:它们被解析为a = (b = (c = 5)),其评估为a = (b = 5),然后是a = 5

如果==运算符的操作数相等,则boolean运算符返回true if。如果true语句的参数为if,则if (5 == 5)语句将运行其正文。因此,if (true)标题while会转换为while (true)。这就是为什么有时你会看到带有标题while的无限boolean循环; if循环运行“而”脚趾参数为真。

如果true语句中有=,那么如果分配的值(或“与...比较”)为==,则不会出现错误并运行代码。这就是永远混淆boolean和{{1}}运算符非常重要的原因,尤其是在使用{{1}}时。

希望这有帮助!!