例如,当我7>1用C语言写入时(如果这不是一直是特征,则说是C99),我可以期望结果恰好是1还是只有一些非零值?这适用于所有bool运营商吗?
可能重复:
C++代码中的双重否定
据我所知,没有C/C++书籍教程或手册提到这种技术.也许是因为它只是一个小小的东西,不值得一提.
我使用它是因为C/C++将bool类型与int,long,pointer,double等混合在一起.需要将非bool转换为bool是很常见的.使用(bool)值来做这件事是不安全的,所以我习惯!!这样做.
例:
bool bValue = !!otherValue;
Run Code Online (Sandbox Code Playgroud) 我从Microsoft的GSL实现(C++指南支持库)中看到了这段代码:
#if defined(__clang__) || defined(__GNUC__)
#define GSL_LIKELY(x) __builtin_expect(!!(x), 1)
#define GSL_UNLIKELY(x) __builtin_expect(!!(x), 0)
#else
#define GSL_LIKELY(x) (!!(x))
#define GSL_UNLIKELY(x) (!!(x))
#endif
Run Code Online (Sandbox Code Playgroud)
我读到了__builtin_expect(这里和这里),但我仍然不清楚双boolean否定运算符的目的是什么(!!(x)).为什么用它?
有问题的文件就是这个.
我对编译器对此的“想法”有争议:
a = 8;
b = !!a;
Run Code Online (Sandbox Code Playgroud)
那么,是b == 0x01?总是TRUE或者0x01可能是,0xFF等等?0xFFFF0xFFFFFFFF
如果我只想提取这种0x00双重(a == 0)否定 方法0x01是否(a > 0)有效?
换句话说:要获得结果只有 0 或 1,使用什么更好?
a) a>0?1:0;
b) !!a
我希望你能理解我的问题。
可能重复:
C中的双重否定:是否保证返回0/1?
int main(void)
{
int i = 2, j = 1;
printf("%d", !!i +!j);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我了解,!! 将表达式转换为bool,所以它是说因为我不等于2,所以值为0 + j,不等于1,值为0,并且因为0等于false,所以它读取:false + false = true代表值1.请帮助我是C编程的新手.