【问题标题】:Is logical negation of zero (!0) compiler dependent in C?零(!0)编译器的逻辑否定是否依赖于C?
【发布时间】:2011-12-18 06:12:33
【问题描述】:

我看到一篇文章提到 !0 的结果取决于编译器。结果可以是 1 或 FF 或 FFFF 等等。

至于 C99 标准 6.5.3.3 一元算术运算符,

逻辑否定运算符的结果!如果其操作数的值比较,则为 0 不等于 0,如果其操作数的值比较等于 0,则为 1。结果的类型为 int。 表达式 !E 等价于 (0==E)。

真的依赖编译器吗?

【问题讨论】:

  • 你没有引用标准,说它评估为 1?!所以它应该是平台/编译器独立的。也许那篇文章的意思是说~0 是平台相关的。
  • 你是从哪里看到那篇文章的?

标签: c c99 negation


【解决方案1】:

似乎已经回答了您自己的问题,引用了标准,其中指定结果必须为 0 或 1。

因此,我能猜到的只是你在问是否所有 C 编译器都符合这方面的标准。由于我没有使用过所有编写过的 C 编译器,因此我无法真正明确地回答这个问题。不过,我从来没有使用过或听说过能产生任何其他价值的产品——考虑到我在这里、Usenet 等网站上闲逛的这些年,似乎很可能,如果这样的野兽我可能听说过它。

编辑:可能值得注意的是,即使在 K&R1 中,它也被明确描述为产生 0 或 1(§A.7.2):

逻辑否定运算符的结果!如果其操作数的值为 0,则为 1,如果其操作数的值为非零,则为 0。

【讨论】:

    【解决方案2】:

    每个编译器都应该在他们的描述中列出他们遵循的标准。 当然,这种描述并不总是完全正确(某些编译器包含错误或对标准的误解),但是布尔值的行为是如此简单和陈旧(来自 C 的第一天),如果一个新的编译器我会感到非常惊讶行为不同。

    所以我总是把它作为官方标准和事实上的标准:(!0) = 1(!1) = 0,都是 int 类型。

    但请注意,在 C++ 中布尔运算符返回 bool 值,因此如果您在 C++ 中编译,将使用 bool,而不是 int。然而 bool 和 int 是可以直接互换的,除了一些 C++ 编译器会在你做一些奇怪的事情时警告你,比如bool x = 10;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2020-06-11
      • 2020-01-22
      相关资源
      最近更新 更多