逻辑&&和逻辑||操作员混淆

时间:2014-03-27 11:44:39

标签: c

我在开源项目中找到了以下代码行:

if(WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP)

我无法理解这段代码。根据代码流程,这应该是(我确定):

if((WIFSTOPPED(status) == SIGTRAP) || (WSTOPSIG(status) == SIGTRAP))

两者是否相同??

5 个答案:

答案 0 :(得分:8)

您提供的两个代码示例并不相同。此

if (WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP)

相当于:

if (WIFSTOPPED(status) != 0 && WSTOPSIG(status) == SIGTRAP)

相当于:

if (!(WIFSTOPPED(status) == 0 || WSTOPSIG(status) != SIGTRAP))

明显不同于:

if ((WIFSTOPPED(status) == SIGTRAP) || (WSTOPSIG(status) == SIGTRAP))

请注意,C运算符优先级的==!=优先级高于&&||。这意味着前一行代码相当于:

if (WIFSTOPPED(status) == SIGTRAP || WSTOPSIG(status) == SIGTRAP)

您需要知道的逻辑运算符的规则是:

!(a && b) == !a || !b

!(a || b) == !a && !b

答案 1 :(得分:2)

不,他们不一样。

if(0)在C中为假,其他任何值都被视为真。

当你写:

if(WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP)

如果WIFSTOPPED(status)返回0,则由于Short-circuit evaluation而不会评估另一方。

就像写作:

if(WIFSTOPPED(status) != 0 && WSTOPSIG(status) == SIGTRAP)

De-Morgan's laws应该对您有所帮助:

  • “not(A and B)”与“(不是A)或(不是B)”
  • 相同
  • “not(A或B)”与“(不是A)和(不是B)”
  • 相同

答案 2 :(得分:0)

不,他们不是一样的

&&&表示如果if语句为真,则两个条件都必须为真。

我不知道WIFSTOPPED(状态)做了什么但是在第二个语句中它不必等于SIGTRAP if(WSTOPSIG(status)等于SIGTRAP

在第一个语句中,WIFSTOPPED(status)必须返回true AND(WSTOPSIG(status)等于SIGTRAP

答案 3 :(得分:0)

两者完全不同......当WIFSTOPPED(状态)== 0和时,第一个条件将适用  WSTOPSIG(状态)== SIGTRAP ...第二个条件适用于   WIFSTOPPED(状态)== SIGTRAP)或(WSTOPSIG(状态)== SIGTRAP)

答案 4 :(得分:0)

这意味着 ::

如果WIFSTOPPED是bool:

if ( (WIFSTOPPED(status) != false) && *(WSTOPSIG(status) == SIGTRAP) )

如果WIFSTOPPED is字符串

if ( (WIFSTOPPED(status) != '') && *(WSTOPSIG(status) == SIGTRAP) )

如果WIFSTOPPED是整数:

if ( (WIFSTOPPED(status) != 0) && *(WSTOPSIG(status) == SIGTRAP) )