2014-10-01 43 views
-2

下面的代码不会用C给出错误为什么一个例子给出一个错误,而其他没有

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

但是,下列情况:

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

这是否有在调用第二个示例中的正则表达式之前,先取消引用指针?如果是这样,有人可以解释为什么?

编辑:对不起,我的编程课是一个例子,所以我相信教师冒昧地把then强调错误会显示。我直接从演讲幻灯片接过代码,所以我认为,重点是基于以下(p && *p)而不是什么其次

+2

C中没有'then'关键字,你能发布实际的代码吗? – ouah 2014-10-01 17:55:19

+1

“给出错误”是什么意思?编译器消息?碰撞?不按预期工作? (你期望什么?)什么是“调用正则表达式”?而伪代码对于像这样的问题并不是真的有用...... – mafso 2014-10-01 17:55:57

+0

好吧,它不是'不','可能不是'是推动者。 “p”不可能被初始化为“NULL”,所以在第一个例子中,解引用几乎不会发生。 – HuStmpHrrr 2014-10-01 18:06:08

回答

2

的代码示例是明显无效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执行得太晚。

1

为什么一个例子,而其他没有给出一个错误?

这是因为这两个代码片段都会调用未定义的行为。您应该注意到,取消引用未初始化的指针会调用UB。

注:没有then关键字C.

+1

严格地说,第一个样本可能会或可能不会导致取消引用。无论如何,这是UB。 – AlexD 2014-10-01 17:59:46

+0

下来选民照顾解释? – haccks 2014-10-02 03:54:49

相关问题