我知道其中一个是按位而另一个是合乎逻辑的,但我无法弄明白:
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
。
答案 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}}时。
希望这有帮助!!