【问题标题】:Comparison between pointer and null character legal?指针和空字符之间的比较合法吗?
【发布时间】:2017-12-18 09:23:52
【问题描述】:

比较指向'\0' 的指针是否合法?

关于clang++的trunk版(25836be2c)

const char *a = "foo";

if(a == '\0')

报错:指针和整数的比较('const char *' and 'int')

if(a == 0)

没有按预期给出任何错误。

空字符不就相当于空指针与指针比较吗?这是编译器错误吗?

另外一点是,这个错误没有出现在“-std=c++03”标志上,而是出现在“-std=c++11”标志上。但是,当我使用 g++ (v4.8.5) 时,两种标准都没有出现错误

【问题讨论】:

  • 请注意,较新版本的 GCC do 会出错。
  • 在 C++11 之前它们是一样的; post C++11 第一个是错误
  • “空字符不就相当于空指针与指针比较吗?” - 不。这一直是一个坏习惯,从来都不是一个好主意。没有“空”字符,但有一个 NUL 字符。有一个nullptr,但这不是一个字符。绝对没有理由将这两个概念混为一谈。
  • @Useless 其他方式:标准 C++ 中没有 NUL(这是 ASCII 的东西)。但是有一个空字符,它被定义为值为0的字符
  • @M.M - 公平点,我真的不喜欢“null”和“NULL”的命名方式,因为这似乎会引起混淆,所以我养成了称呼角色@的习惯987654325@ 稍微减少歧义。 OP:一个“空”字符,但是将它与指针进行比较仍然没有用。

标签: c++


【解决方案1】:

这是从 C++03 到 C++14 的变化。在 C++03 中,[conv.ptr]p1 说:

空指针常量是整数类型的整数常量表达式右值,其计算结果为零。

字符文字是一个整数常量表达式。

在 C++14 中,[conv.ptr]p1 表示:

空指针常量是一个整数文字,其值为 0 或 std::nullptr_t 类型的纯右值。

字符文字不是整数文字,也不是 std::nullptr_t 类型。

最初发布的 C++11 版本不包含此更改;但是,它是由于缺陷报告 DR903 引入的,并在 2013 年 1 月(该 DR 的最后评论日期)之后的某个时间被纳入标准。

因为更改是 DR 的结果,编译器将其视为现有标准的错误修复,而不是下一个标准的一部分,因此 Clang 和 GCC 都在 -std=c++11 时做出了行为更改,而不仅仅是在 @ 987654323@。然而,显然这种变化直到 4.8 版之后才在 GCC 中实现。 (具体来说,它似乎只在 GCC 7 及更高版本中实现。)

【讨论】:

    【解决方案2】:

    来自[conv.ptr]§1

    空指针常量 是一个整数文字,其值为 0 或类型为 std​::​nullptr_­t 的纯右值。 [...]

    '\0' 不是整数文字,而是字符文字,因此不适用转换。

    【讨论】:

    • 在 C 标准中,字符常量被称为 int 类型。在 C++ 中不是这样吗?你能给我一个参考,它说 '\0' 是字符类型而不是整数类型
    • @Pratik - 不是标准参考,而是相关问题stackoverflow.com/questions/2172943/size-of-character-a-in-c-c
    • @PratikBhatu C 不是 C++。它们是不同的语言,因此您不应期待相同的行为。
    • @PratikBhatu 在 C++ 中并非如此,但 类型无关。无论类型如何,字符文字在语法上与整数文字不同。
    • @PratikBhatu [[lex.ccon]§2](eel.is/c++draft/lex.ccon#2):“不以u8uUL 开头的字符文字是一个普通字符文字。一个普通字符文字包含一个可以在执行字符集中表示的c-char,其类型为char, [...]"
    猜你喜欢
    • 2021-09-14
    • 2012-04-18
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多