以下代码不会在C
中出错char * p;
if (p && *p) then
foo();
但是,以下是:
char * p;
if (*p && p) then
foo();
在第二个示例中调用正则表达式之前,这是否与取消引用指针有关?如果是这样,有人可以解释原因吗?
编辑:很抱歉这是混乱,但这是我编程课程中的一个例子,所以我相信教师可以放任then
来强调错误会显示出来。我直接从讲座幻灯片中获取了代码,因此我认为重点更多地放在以下(p && *p)
上,而不是后面的内容
答案 0 :(得分:2)
代码示例显然无效C.正如其他人已经指出的那样,C没有then
个关键字。这可能仅仅是您的导师的错误,并非旨在特别说明任何内容。我将展示类似的例子来说明这一点。
此代码是正确的:
char *p;
/* code that assigns a value to p omitted */
if (p && *p)
foo();
任何标量值都可以用作条件;如果它等于零则将其视为假,否则视为真。 (在原始示例中,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
执行得太迟了。
答案 1 :(得分:1)
为什么一个例子会出错而另一个没有呢?
这是因为两个代码段都调用了未定义的行为。您应该注意,取消引用未初始化的指针会调用UB。
注意: C中没有then
个关键字。