【问题标题】:compiler allows 'char * k= false'? Why?编译器允许'char * k = false'?为什么?
【发布时间】:2012-10-24 08:16:40
【问题描述】:

从我的编译器行为的角度来看,我发现很奇怪,它允许将布尔值分配给 * char

char * k= false;

为什么?但是赋值后 * char 仍然没有初始化。为什么编译器不允许分配int 值?

【问题讨论】:

  • 这使得kchar * k = 0 一样成为NULL 指针。
  • 这是从boolchar * 的隐式转换。但是,这仅适用于转换为 (int) 0 的常量表达式,它是指针的特殊初始化程序。如果有人引用标准中的相应规则会很有趣。

标签: c++


【解决方案1】:

它将隐式地将布尔值false 转换为值为零的整数,并因此声明一个NULL 指针。它实际上与

没有什么不同
char* k = 0;

这是有效的语法

【讨论】:

    【解决方案2】:

    C++03 标准,#4.10:

    空指针常量是一个整数常量表达式 (5.19) 计算结果为零的整数类型的右值。

    5.19:

    一个整型常量表达式只能包含文字(2.13), 枚举器、常量变量或整数的静态数据成员或 用常量表达式初始化的枚举类型(8.5), 整数或枚举类型的非类型模板参数,以及 sizeof 表达式。

    false 是一个布尔字面量,因此属于常量表达式的范畴,因此可以作为空指针常量。

    【讨论】:

    • bool是一个整数类型(3.9.1/7)。
    【解决方案3】:

    falsetrue01 的快捷方式。对于指针,您使用NULL 其中define NULL 0。所以它的语法正确。

    【讨论】:

      【解决方案4】:

      编译器允许这样做,因为在 C++ 中 false0NULL 相同。

      就个人而言,至少对于赋值而言,我发现使用NULL 表示空指针更容易理解和更正确。

      顺便说一句,在 C++ 之前,在某些系统上 NULL 实际上是一个定义为 (void*)0xffff 的宏;一些背景可以在this answer找到。

      【讨论】:

      • 我需要在标准中验证这一点,但在 C++ 中,NULL 为 0。查看 B. Stroustrup 页面,我得到了 C++ 初始创建者本身的确认:stroustrup.com/bs_faq2.html#null
      • @paercebal 我急切地想找到我记得它的地方,所以我同时改写了我的答案:)
      • FWIW, Wikipedia says “C++ 有一个单独的布尔数据类型 ('bool'),但它可以自动转换标量和指针值,这与 C 非常相似”。目前手头没有标准。
      • 精度:从标准 (N3337) 的第 4.10 节,我们有:A null pointer constant is an integral constant expression (5.19) prvalue **of integer type that evaluates to zero** or a prvalue of type std::nullptr_t。这意味着无论系统如何,在 C++ 中,NULL 始终是一个整数类型,其计算结果为零。
      • @paercebal 我必须承认我从来没有读过 C++ 标准,但是这是标准化的很好 :) 我找到了我的源 btw,我已经添加了指向另一个答案的链接。跨度>
      猜你喜欢
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2012-10-04
      • 1970-01-01
      相关资源
      最近更新 更多