我看到了这段代码:
char *str;
// Some code
if (! str || ! *str)
return str;
为什么需要检查! *str
?还if (! str)
不够吗?
让我们看一个真值表:
str *str !str !*str !str || !*str
T T F F F
F T T F T
T F F T T
F F T T T
因此,如果str
是一个NULL指针,则!str
它将为true,str
并且始终返回。如果str
不是NULL指针,则str
仅当*str
是NUL终止符时才返回。
请注意,您可以使用布尔代数将其重写为!(str && *str)
。括号可以用英语表示为“非空字符串”。因此整个条件是“非非空字符串”。
请注意,它的工作是由于短路,这意味着如果||
或的结果&&
只能由左操作数确定,则将不评估右操作数。否则,当str
为NULL指针时,取消引用将产生未定义的行为。
在这里,有一个非常重要的逻辑要注意。仅仅因为字符串不是“不为空”,并不一定意味着它为空。但这取决于解释。共有三种情况,下面是所有示例。
"Hello, World\0"
-绝对不是空的"\0"
-绝对是空的NULL
-绝对不是“不为空”,但是它是空的吗?我可能会补充说,这是返回的相当奇怪的条件str
。这通常不是您要做的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句