我正在看一个例子,我看到了这个:
char *str;
/* ... */
if (!str || !*str) {
return str;
}
这是否意味着它是空的还是什么?
答案 0 :(得分:6)
str
是一个char指针。 !
否定它。基本上,!str
时str == NULL
将评估为真(1)。
第二部分是,(如果str
指向某事)评估为true(1)如果第一个字符是空字符('\0'
) - 意味着它是一个空字符串。
注意:
*str
取消引用指针并检索第一个字符。这与执行str[0]
相同。
答案 1 :(得分:4)
!str
表示没有分配给str
的内存。 !*str
表示str
指向空字符串。
答案 2 :(得分:2)
在询问之前,你可以做一些小测试。
#include <stdio.h>
int main()
{
char *str = "test";
printf("%d\n",*str);
printf("%c\n",*str); // str[0]
printf("%d\n",str);
if (!str || !*str)
{
printf("%s",str);
}
return 0;
}
!
的含义是否定。除0
以外,if
条件的每个值均为真。此处,str
和*str
返回的值不是0
。所以,你可以做出推断。
答案 3 :(得分:0)
如果str设置为!str
,则第一个表达式NULL
计算为true;如果设置为的其他任何内容,则为false,无论指向的内存是否仍然分配 。如果将str
设置为不再有效的内存,则可能导致未定义的行为。
如果!*str
中的地址处的值为str
(空字符),则第二个表达式\0
的计算结果为true,但如果!str
计算为{true},则根本不进行评估由于布尔OR运算符的短路动作。