我在开源项目中找到了以下代码行:
if(WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP)
我无法理解这段代码。根据代码流程,这应该是(我确定):
if((WIFSTOPPED(status) == SIGTRAP) || (WSTOPSIG(status) == SIGTRAP))
两者是否相同??
答案 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应该对您有所帮助:
答案 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) )