【问题标题】:Is this C++ standard compliant : double bang on double e.g. !!(-0.0)这是否符合 C++ 标准:双键,例如!!(-0.0)
【发布时间】:2020-07-06 02:45:12
【问题描述】:

以下行是否符合!!(val) 标准。即这是否可移植到其他编译器和硬件?

我已经使用 gcc 和 clang 编译器对此进行了测试,它适用于多个版本。但是能保证合规吗?

#include<iostream>
bool isNonZero(double val) {
    return !!(val);
}

int main()
{
    std::cout <<  std::boolalpha << isNonZero(-0.0) << std::endl; 
    std::cout <<  std::boolalpha << isNonZero(0.0) << std::endl; 
    std::cout <<  std::boolalpha << isNonZero(1.001) << std::endl; 
    std::cout <<  std::boolalpha << isNonZero(-1.001) << std::endl; 
    return 0;
}

【问题讨论】:

  • not-not x 只是 x。没有意义的就是它。 return val 具有完全相同的效果。
  • @sweenish 在这个上下文中是一样的。更一般地说,它需要一个可以根据上下文转换为bool 的操作数。是的,同样的上下文转换是由bool 函数中的return 语句执行的。但是,例如,!!"hello"通常等同于"hello"
  • "hello" 的计算结果为真,与!!"hello" 完全相同。无论是否有多余的输入,您都可以进行 bool 转换。我可以告诉你,我的评论并没有强调与 C++ 的细微差别,其中 bool 和字符串文字(例如)实际上并不相同。但是我的第一句话也没有使用代码。逻辑上,not-not-x 就是 x。因此,在代码中,返回 val 是等价的。双爆炸并没有使它更具可读性。我怀疑是否会生成任何额外的程序集,但这种语法根本没有帮助。

标签: c++ double


【解决方案1】:

是的,它是便携式的。

! 运算符的操作数根据上下文转换为bool,如果结果为false,则生成true,如果结果为true,则生成false。第二个! 逆转了这一点。 !!(被解析为两个! 运算符,因为没有!! 标记)实际上将其操作数规范化为bool,如果表达式非零则产生true,如果是false零。

但在我看来,你的函数会更清楚地写成:

bool isNonZero(double val) {
    return val != 0;
}

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 2013-12-17
    • 2011-10-31
    • 2011-11-23
    • 1970-01-01
    • 2016-12-03
    • 2011-05-22
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多