2012-12-30 49 views
0

该代码:为什么这个PHP字符串比较工作?

$fn0 ='Joe'; 
    $sn = 'Bloggs'; 
    $fn1 = 'Joseph'; 
    if ( (!strcasecmp($fn0, $first_name)) 
     ||(!strcasecmp($fn1, $first_name)) 
     &&(!strcasecmp($sn, $last_name)) 
    ){ 
     echo('<h3>Hello Joe Bloggs!</h3>'); 
     } 

完美地工作。

但是为什么?

如果不是(FN 0)OR NOT(FN1)以及NOT(SN),然后打印 “你好李四”

当然,它应该显示 “Hello李四” 因为这是李四的一切,但这不是这种情况:它将显示上述消息iff($ first_name ==“joe”||“joseph”)& & $ last_name ==“bloggs”。

任何人都可以破译?

+1

因为[“*'strcasecmp'返回... 0,如果两个字符串相等。*”](http://us.php.net/strcasecmp) 。 '!0 == true'。 – DCoder

+0

你的代码是'If(NOT(fn0)OR NOT(fn1))== true AND NOT(sn)== true THEN PRINT ...' – cppanda

回答

0

第一次比较结果为TRUE后,不需要“或”条件。当然,我们必须假定有对FIRST_NAME $某处一些定义...

+0

Man page References:http://us1.php.net/manual /en/language.expressions.php http://us1.php.net/manual/en/language.operators.comparison.php http://php.net/manual/en/language.operators.logical.php –

1

看看你的括号

if ((!strcasecmp($fn0, $first_name) || !strcasecmp($fn1, $first_name)) 
    && (!strcasecmp($sn, $last_name))) { 
... 
} 

的错误是||&&逻辑。如果第一个检查是真的,其余的将被忽略

+0

@ bukifixart你是对的 - 但那不是答案。我认为DCoder是正确的:它返回0被解释为'假';所以这个价值的否定是必需的 - 相当混乱。 – Stumbler

+0

好吧,否定“非真实解释值”应该是真的,混淆在哪里? – bukart

+0

这是令人困惑的功能是这样设计的;如果平等的话,我会预料它会返回真实的;但虽然不直观,但可以轻松解决。 – Stumbler

相关问题