Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 括号和逻辑运算符_Java_C++_Logical Operators_Short Circuiting - Fatal编程技术网

Java 括号和逻辑运算符

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

考虑以下代码(C++):

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);