【发布时间】: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 是等价的。双爆炸并没有使它更具可读性。我怀疑是否会生成任何额外的程序集,但这种语法根本没有帮助。