Java 括号和逻辑运算符
考虑以下代码(C++):Java 括号和逻辑运算符,java,c++,logical-operators,short-circuiting,Java,C++,Logical Operators,Short Circuiting,考虑以下代码(C++): intx=-4,y=5; 布尔结果=x>0&&y++0)将首先求值,由于(x>0=false)和短路求值,将不求值另一个表达式(y++0)和&(y++,评价为保证停止。 我想Java也是这样 括号是多余的,在这种情况下不相关-它与运算符优先级无关。它只是与&的工作方式有关: 事实上,这两个版本 x > 0 && y++ < 10 (x > 0) && (y++ < 10) 5.14逻辑AND运算符[表达式日志AN
intx=-4,y=5;
布尔结果=x>0&&y++<10;
表达式(x>0)将首先求值,由于(x>0=false)和短路求值,将不求值另一个表达式(y++<10),y的值将保持为5
现在考虑下面的代码:
int x = -4 , y = 5 ;
bool result = (x > 0) && (y++ < 10) ;
intx=-4,y=5;
布尔结果=(x>0)和&(y++<10);
预计括号中的表达式将首先求值,以便在执行逻辑AND之前,表达式(y++<10)已求值,y的值已变为6
,但实际情况是y的值仍然是5。这意味着即使使用括号,计算也会短路,表达式(y++<10)也会被忽略
这个案子的解释是什么 问题中有解释-短路 在C++中,对<代码>和(和<代码> <代码> >的评价保证为左到右,一旦遇到< <代码> false <代码>(分别为<代码>真< /代码> <代码> < <代码> >,评价为<强>保证停止。 我想Java也是这样 括号是多余的,在这种情况下不相关-它与运算符优先级无关。它只是与
&
的工作方式有关:
事实上,这两个版本
x > 0 && y++ < 10
(x > 0) && (y++ < 10)
5.14逻辑AND运算符[表达式日志AND]
1从左到右的&&
操作员组。操作数都隐式转换为bool类型(第4条)。结果
如果两个操作数均为true
,则为true,否则为false
不像&、&&保证从左到右的求值:第二个
如果第一个操作数为false
(强调我的操作数),则不计算操作数
当左侧确定结果时,不计算右侧 在第一种情况下,右侧为
y++<10
,不进行计算。在第二种情况下,右侧为(y++<10)
,不进行计算
没有先计算括号中的表达式的规则。仅使用括号分组操作数。即使使用括号,也必须发生短路。考虑如果你有一个包含指针的表达式:
int* ptr = 0;
int bar = 5;
bool result = (ptr != 0) && (*ptr == bar || bar > 10);
显然,您无法安全地计算
&&
的右侧,但需要使用括号才能使优先级按预期工作。括号只是确定实际执行的操作的顺序,而不是它们以特定的顺序发生。“预计括号中的表达式将首先求值”——错误。括号没有区别,x>0
在这两种情况下总是先求值。括号可以覆盖优先级,但是。求值顺序由序列点(C,C++98/03)或顺序约束(C++11)决定,而不是优先级或关联性。除非出现&&项,否则不会求值右侧。虽然你正确地认为,在数学中,首先要评估父母们,但布尔逻辑有点不同,因为它是从左到右的保证。FIjava具有非短路和(<代码>和代码>)和(或<代码> <代码> >。@ StEvGuo是位运算器,C++版本也不短路。
(x > 0) && ((y++) < 10)
int* ptr = 0;
int bar = 5;
bool result = (ptr != 0) && (*ptr == bar || bar > 10);