Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
c语言中的内部短路评估_C_Logical Operators_Short Circuiting - Fatal编程技术网

c语言中的内部短路评估

c语言中的内部短路评估,c,logical-operators,short-circuiting,C,Logical Operators,Short Circuiting,我知道Java和C/C++有短路求值,也就是说,在if a&&b中,如果a不为true,b将永远不会求值 但是如果我有一个表达式,比如a&&b OP c,其中OP是一个任意的逻辑运算符,如果a=false,b会被计算吗?谢谢。如果a=false,则始终有:a&&b==0,无论b的值是多少。为什么评估后的手术会改变这一点 a b | a && b 0 0 | 0 0 1 | 0 如果a=false,则不会检查b的条件,因此a&&b始终为false 下一个条件取决

我知道Java和C/C++有短路求值,也就是说,在if a&&b中,如果a不为true,b将永远不会求值

但是如果我有一个表达式,比如a&&b OP c,其中OP是一个任意的逻辑运算符,如果a=false,b会被计算吗?谢谢。

如果a=false,则始终有:a&&b==0,无论b的值是多少。为什么评估后的手术会改变这一点

a b  |  a && b 
0 0  |   0
0 1  |   0
如果a=false,则不会检查b的条件,因此a&&b始终为false 下一个条件取决于使用的OP,如果它是&&它将不被计算。如果是| |将进行评估

所以

这里,如果a=false,a&b将始终为false。

C标准规定-

6.5.13逻辑与运算符

&&运算符保证从左到右求值。。。。。。 。如果第一个操作数的比较值等于0,则不计算第二个操作数。
因此,如果a==flase b将不会被计算。

你知道,最简单的事情就是测试这个…@realpoint我可以测试它,但是标准怎么说呢?没有标准,这是布尔逻辑,Java的标准是。@coincoin:只有在标准确实这么说的情况下。这个问题是正确的。&和|不是逻辑运算符。&和|是位运算符。Sry,我指的是C/C++@对于错误的真实性表示感谢,感谢告诉我看到文档&是位运算符@安德烈亚斯:这是一个很好的例子,说明为什么把多个语言标签扔进一个问题是个坏主意。这是一个关于java和C++的问题,所以使用布尔作为整数可能不是解释你的观点的最好方法。顺便说一下,a=false应该是a=false,或者更好!最后,短路没有绝对合理的原因,人们可能仍然希望通过评估b来触发一些副作用,而不必考虑顺序。相反,人们也可以防止这种副作用的发生,这是一个错误。这只是一个惯例问题,这些语言选择了短路作为解决方案convention@Dici与习俗无关。这是定义。在Java中,如果a不是5,则a==5&&remove42被定义为不调用remove方法,而a==5&remove42被定义为始终调用remove方法。这是一种约定,因为我可以创建一种始终计算所有表达式的语言。。。这是语言创造者的选择,而不是obligation@Dici:然后对逻辑运算符使用bool-only子表达式和位运算。这也可以工作,但可以避免短路。或者使用Ada,它提供两种日志操作。对于大多数应用,肖尔特电路是更好的选择或不相关。注意:允许表达式中出现副作用也是一种惯例
((a && b) OP c)