的代码示例是明显无效C.正如其他人已经指出,C没有then
关键字。这可能只是你的老师的一个错误,并不是为了特别说明任何事情。我将展示类似的例子来说明这一点。
该代码是正确的:
char *p;
/* code that assigns a value to p omitted */
if (p && *p)
foo();
任何标量值可被用作一个条件;如果它等于零,则将其视为false,否则视为true。 (在原始样品,p
是未初始化,导致未定义的行为,如果使用它的值,但我会承担任何初始化代码简单地省略)
以上可以更明确地写成:
char *p;
/* code that assigns a value to p omitted */
if (p != NULL && *p != '\0')
foo();
如果p
是空指针,则评估*p
将会失效(导致未定义的行为)。通过测试p
在尝试解引用之前是否为空,上述代码避免了任何此类错误,因为&&
具有短路行为。该if
声明也可以写为:
if (p != NULL) {
if (*p != '\0') {
foo();
}
}
该代码调用函数foo
如果p
是一个非空指针指向一个非空字符。 (这些是“null”这个词的两个不同含义。)如果p
意味着指向字符串的指针,那么p != '\0'
意味着它指向的字符串不是空的。
现在第二示例:
char *p;
/* code that assigns a value to p omitted */
if (*p && p)
foo();
,或者更明确地:
char *p;
/* code that assigns a value to p omitted */
if (*p != '\0' && p != NULL)
foo();
这会导致不确定的行为(可能是一个程序崩溃)如果p
是空指针。在程序已经崩溃后,检查p != NULL
执行得太晚。
C中没有'then'关键字,你能发布实际的代码吗? – ouah 2014-10-01 17:55:19
“给出错误”是什么意思?编译器消息?碰撞?不按预期工作? (你期望什么?)什么是“调用正则表达式”?而伪代码对于像这样的问题并不是真的有用...... – mafso 2014-10-01 17:55:57
好吧,它不是'不','可能不是'是推动者。 “p”不可能被初始化为“NULL”,所以在第一个例子中,解引用几乎不会发生。 – HuStmpHrrr 2014-10-01 18:06:08