我正在阅读一个使用 glib 的 C 语言的开放代码,我发现了类似这样的东西
gboolean function()
{
guint myVar = 0;
myVar = (!!globalVar1 + !!globalVar2 + !!globalVar3);
return !!myVar;
}
我不明白那个双感叹号到底发生了什么。
最佳答案
一元 !
运算符执行逻辑 NOT 运算。如果其操作数非零,则计算结果为 0。如果其操作数为 0,则计算结果为 1。
当它们中的两个像这样放在一起时,它将操作数规范化为 bool 值。因此,如果操作数为 0,则结果为 0,如果操作数非零,则结果为 1。
在较大表达式的上下文中:
myVar = (!!globalVar1 + !!globalVar2 + !!globalVar3);
这会将 myVar
设置为 0 到 3 之间的值。然后:
return !!myVar;
将该值标准化为 0 或 1。因此最终结果是,如果 3 个变量中的任何一个不为零,则返回 1,否则返回 0。
函数体可以重写为:
return globalVar1 || globalVar2 || globalVar3;
哪个更清楚地表达了意图。然而,||
运算符确实涉及分支,因此所编写的代码可能试图避免该分支。
不过,一般来说,编译器非常擅长优化,因此这种微优化并不是真正必要的。
关于c - return !!myVar 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70216892/