为什么一个例子给出错误,而另一个没有

时间:2014-10-01 17:52:49

标签: c

以下代码不会在C

中出错
char * p;
 if (p && *p) then 
foo(); 

但是,以下是:

char * p;
 if (*p && p) then 
foo(); 

在第二个示例中调用正则表达式之前,这是否与取消引用指针有关?如果是这样,有人可以解释原因吗?

编辑:很抱歉这是混乱,但这是我编程课程中的一个例子,所以我相信教师可以放任then来强调错误会显示出来。我直接从讲座幻灯片中获取了代码,因此我认为重点更多地放在以下(p && *p)上,而不是后面的内容

2 个答案:

答案 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个关键字。