【问题标题】:double negation in C : is it guaranteed to return 0/1?C中的双重否定:是否保证返回0/1?
【发布时间】:2011-12-23 14:18:00
【问题描述】:

标准是否保证!!(x)返回0/1?

请注意,我不是询问 c++,其中定义了 bool 类型。

【问题讨论】:

  • @DanFego:自从 C 首次标准化以来,它就具有明确定义的行为,因此标准无关紧要。
  • What is !0 in C? 的可能重复项
  • C 在stdbool.h 中有一个_Bool 类型和一个bool

标签: c standards


【解决方案1】:

是的,在 C99 中,请参阅 §6.5.3.3/4:

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

所以!x!!y 只能产生0 或1,如ints。

对于其他运算符,在 C99 中,另请参阅 Is the "true" result of >, <, !, &&, || or == defined?

【讨论】:

  • 谢谢。只是如果您好奇为什么:我将它用于 uni 比赛,我的代码将在没有 gcc 优化的情况下运行,我发现使用 !!x 将我的代码时间减少了约 5% 然后 x = ( x ? 1 : 0)。无论如何,感谢标准的引用,非常有帮助。
  • 其他 C 标准怎么样?
【解决方案2】:

这确实是一条评论,但是太长了。 (请不要仅以此为基础投反对票。)

我在寻找回答您问题的标准时发现了一个非常奇怪的文件:The New C Standard: An Economic and Cultural Commentary. 他们说学术界资金不足。 (Here 是完整的 2083 页 10.5MB PDF。前一个链接只是关于双重否定的部分。)

关于双重否定的问题是这样说的:

双重否定通常在英语中被解释为肯定的陈述(例如,“在 C 源代码中出现双重否定并不是未知的”)。适用于 C 语言的相同语义。但是,在某些语言(例如西班牙语)中,双重否定被解释为使陈述更加否定(这种用法确实出现在随意的英语演讲中,例如,“你还没有看到任何东西” ,但在socially1上很少见且皱眉)。

我相信作者会很高兴知道这对回答你的真正问题没有任何用处(答案是肯定的。)

【讨论】:

  • 投票的标准是有用性,而正如你所说,这个答案“毫无用处”。
  • @PeteKirkham,我非常不同意,常见问题解答也是如此:“每当你遇到一个非常草率、不费吹灰之力的帖子,或者一个明确且可能很危险的答案时,请使用你的反对票不正确。” 不管怎样,圣诞快乐,新年快乐。
  • @Tim 但是赞成票的箭头说“这个答案很有用”。现在,您的帖子最后给出了该问题的正确答案,因此可以证明其有用性。但它足够有用吗?不是真的,只考虑与 OP 的问题有关的部分。但是为了研究工作和一个了不起的发现,我稍微扩展了一些规则;)
  • @DanielFischer 非常感谢。但是我不是在寻找投票 - 这确实是评论,而不是答案 - 我只是不想要 DV :)
  • 我明白这一点,但我想奖励你几周内最有趣的发现:D
猜你喜欢
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2019-06-03
相关资源
最近更新 更多