gpt4 book ai didi

c - 为什么一个示例给出错误,而另一个示例则没有

转载 作者:行者123 更新时间:2023-11-30 20:06:14 26 4
gpt4 key购买 nike

以下代码在 C 中不会给出错误

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

但是,以下情况确实如此:

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

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

编辑:抱歉造成混淆,但这是我的编程课上的一个示例,因此我相信讲师冒昧地放置了 then 来突出显示将显示错误。我直接从讲座幻灯片中获取了代码,因此我相信重点更多地放在以下 (p && *p) 上,而不是接下来的内容

最佳答案

代码示例显然是无效的 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 是否为 null,上面的代码可以避免任何此类错误,因为 && 具有短路行为。 if 语句也可以写成:

if (p != NULL) {
if (*p != '\0') {
foo();
}
}

如果p是指向非空字符的非空指针,则代码调用函数foo。 (这是“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 - 为什么一个示例给出错误,而另一个示例则没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26147498/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com