1

这是什么原因?我认为如果指针为空,则不会评估其余条件。

// doesn't work:
char *ptr = somefunction();

if (ptr && ptr[0] == '1' || ptr[0] == 't')
  // ...



// does work:
char *ptr = somefunction();
if (ptr)
    if (ptr[0] == '1' || ptr[0] == 't')
        // ...
4

4 回答 4

5
ptr && ptr[0] == '1' || ptr[0] == 't'

方法:

  • if ptr && ptr[0] == '1'(false, 因为ptr是 null 并且ptr[0] == '1'不被评估)
  • ptr[0] == 't'(繁荣)

利用:

ptr && (ptr[0] == '1' || ptr[0] == 't')

反而。

于 2012-05-17T22:54:38.610 回答
3

&&具有更高的优先级||因此代码等效于:

if ((ptr && ptr[0] == '1') || ptr[0] == 't')

如果第一个失败,则评估(...&&..)后半部分。||

于 2012-05-17T22:55:26.260 回答
1

您的评估顺序不正确。这将起作用:

if (ptr && (ptr[0] == '1' || ptr[0] == 't'))

基本上,任何时候你的代码中都有这两者&&||你需要一个括号来确保它符合你的意思。

于 2012-05-17T22:54:50.797 回答
1

您有 Null ptr && dereferenced Null ptr 这会导致段错误。

C 让您可以选择让 if (ptr == NULL) 之类的语句做某事;如果在检测到空指针时它总是将条件评估为假,那么这样的语句将不起作用。

于 2012-05-17T23:30:25.240 回答