C中的双重否定:是否保证返回0/1?

ami*_*mit 38 c standards

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

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

Mat*_*Mat 45

是的,在C99中,见§6.5.3.3/ 4:

逻辑否定运算符的结果!是0,如果它的操作数的值不相等的比较为0,1,如果其操作数的值进行比较等于0.结果具有类型INT.表达式!E等价于(0 == E).

所以!x并且!!y只能得到0或1,如ints.

对于其他运算符,在C99中,另请参见>,<,!,&&,||的"true"结果 或==定义?

  • 谢谢。只是如果您好奇为什么:我在单项竞赛中使用它,而我的代码将在没有gcc优化的情况下运行,我发现使用`!! x`将我的代码时间减少了5%左右,然后才是`x =(x?1: 0)`。无论如何,感谢标准的引用,它非常有帮助。 (2认同)

Tim*_*Tim 15

这真的是一个评论,但它太长了.(请不要仅仅在此基础上投票.)

在寻找回答你问题的标准时,我发现了一个非常奇怪的文件:新C标准:经济和文化评论.他们说学术界资金不足.(是完整的,2083页10.5MB PDF.前一个链接只是关于双重否定的部分.)

在双重否定的主题上有这样的说法:"双重否定通常被解释为英语中的正面陈述(例如,"在C源中出现双重否定并不是未知的.).适用的语义相同但是,在一些语言中(例如,西班牙语),双重否定被解释为使得陈述更加消极(这种用法确实发生在随意的英语演讲中,例如,"你还没有看到任何东西",但它很少见在社交上皱起眉头1)."

我相信作者会很高兴知道这在回答你的真实问题时毫无用处(答案是肯定的.)

  • 投票的标准是有用的,正如你所说,这个答案“毫无用处”。 (2认同)
  • @PeteKirkham,我恭敬地不同意,常见问题解答:*"当你遇到一个非常草率,不费力的消费帖子,或者一个显然也许是危险错误的答案时,请使用你的downvotes."*无论如何,圣诞快乐和快乐新年. (2认同)
  • @Tim但是赞成的箭头说“这个答案很有用”。现在,您的帖子最后对问题有正确的答案,因此您可以为它的有用性辩护。但是,投票是否足够有用?不完全是,仅考虑有关OP问题的部分。但是为了研究工作和一个了不起的发现,我对规则进行了扩展;) (2认同)