Java '==';和'=';?

Java '==';和'=';?,java,operators,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无法转换为布尔值,或者x=0的结果无法转换为布尔值==检查

我知道其中一个是按位的,另一个是逻辑的,但我无法理解:

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
无法转换为
布尔值
,或者
x=0
的结果无法转换为
布尔值

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

== is an equality check. if (x == 0) // if x equals 0
= is an assignment. x = 0; // the value of x is now 0
您正在做的是:
if(x=Blah)
-在Java中,此语句是非法的,因为您无法测试赋值语句的状态。具体来说,Java不将赋值视为布尔运算,这是if语句中所必需的。这与C/C++相反,C/C++允许您将赋值视为布尔运算,并且可能是许多拉毛错误的结果。

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

== is an equality check. if (x == 0) // if x equals 0
= is an assignment. x = 0; // the value of x is now 0
这里您将0的值赋给变量x。Java中的if语句不能像在许多其他语言中那样计算整型参数。在Java中,if需要一个布尔值。试一试

if(x == 0)

进行比较。

当您写入“x=0”时,您说的是“将0存储在变量x中”。整个表达式的返回值为“0”(如下所示,您可以说x=y=0之类的傻话)

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


在Java中,不能只说if(0),因为if需要一个真/假答案。因此,如果(x=0)不正确,但如果(x==0)正确。

将错误解释为

“表情

x=0

无法转换为布尔值。“

正如其他人所说,'='是赋值;'='是比较

在您的程序更改中

如果(x=0)

如果(x==0)


为了澄清C/C++的问题,赋值被计算为正确的操作数

if(a = n)
计算为n,因此(n=1)为真(n=0)为假


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

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

我发现一种避免这种情况的方法是将常量表达式放在左手边,如下所示:

if (0 == x) 
   ...

这样,如果我不小心只使用了一个“=”符号,编译器将失败,并出现一个关于赋值给常量表达式的错误,无论赋值运算符是否为左关联运算符,以及if条件是否需要强类型布尔值。

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


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

如其他人所述,
=
在比较时赋值

然而,这些语句也有自己的价值

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

=
运算符返回一个
布尔值,如果其操作数相等,则该值为
true
if
语句在其参数为
true
时运行其主体。因此,
if
if(5==5)
这样的标题将转换为
if(true)
。这就是为什么有时您会看到无限
while
循环,其标题为
while(true)
while
循环运行“while”参数为true

如果在
If
语句中有
boolean
,则如果分配的值(或“与之比较”)为
true
,则不会给出错误并运行代码。这就是为什么不要混淆
=
=
运算符非常重要的原因,尤其是在使用
布尔


希望这有帮助

位运算符和逻辑运算符适用于and(&)和OR(|)运算符,而不是等号运算符。此外,请更改sysout。再敲两下键盘就能救一只小狗(“ur”杀死小狗)。@Instantsoup:这就解释了lolcats。为什么这个问题被记下来了?是因为小狗的诱饵吗?这是一个正确的问题。为什么它被标记下来?C++编译器警告这个例子。因此,如果您正在查看警告错误,而不仅仅是编译器错误(推荐策略:),您会注意到它。它是一个equals表达式(可能是一个表达式语句)。表达式的值是右侧子表达式的值。如果x和y是布尔或布尔的,则完全正确(c=y)。C和C++允许它(带有警告),因为测试值是0还是不(粗略)。有布尔类型。@Neda,因为x和y都是布尔类型,如果(x=y)等于“将y的值存储在x中,如果新的x值为“true”,请执行一些操作。”具体来说,Java不将赋值视为布尔操作,这是if语句中所必需的。“-事实上,这是不正确的。
x=Blah
的类型将是
boolean
。。。当且仅当
x
的类型为
boolean
if (0 == x) 
   ...
if (( x = blah ) > 0) ...