这是什么原因?我认为如果指针为null,则不会评估其余条件。
// 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')
// ...
答案 0 :(得分:5)
ptr && ptr[0] == '1' || ptr[0] == 't'
表示:
ptr && ptr[0] == '1'
(false,因为ptr
为空且ptr[0] == '1'
未获得评估)ptr[0] == 't'
(繁荣)使用:
ptr && (ptr[0] == '1' || ptr[0] == 't')
代替。
答案 1 :(得分:3)
&&
有higher precedence而不是||
所以代码相当于:
if ((ptr && ptr[0] == '1') || ptr[0] == 't')
如果第一个(...&&..)
失败,则评估||
的后半部分。
答案 2 :(得分:1)
您的评估顺序不正确。这将有效:
if (ptr && (ptr[0] == '1' || ptr[0] == 't'))
基本上,只要您的代码中同时包含&&
和||
,就需要在其中加上括号以确保它符合您的意思。
答案 3 :(得分:1)
你有Null ptr&& dereferenced Null ptr导致seg错误。
C使您可以选择if(ptr == NULL)之类的语句; 如果在检测到空指针时始终将条件评估为false,则此类语句将无效。