首页 > 解决方案 > 这是否符合 C++ 标准:双重标准例如 !!(-0.0)

问题描述

是否符合以下线路!!(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;
}

标签: c++double

解决方案


是的,它是便携式的。

运算符的!操作数在上下文中转换为,如果结果是,则bool它产生,如果结果是。第二个相反。(它被解析为两个运算符,因为没有标记)实际上将其操作数归一化为,如果表达式非零,则产生,如果它为零。truefalsefalsetrue!!!!!!booltruefalse

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

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

推荐阅读