c - return !!myVar 是什么意思?

标签 c unary-operator negation

我正在阅读一个使用 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/

相关文章:

c - 全局变量对于子进程和父进程是静态的吗?

c - 如何在网站 lxr.free-electrons.com 找到结构的完整定义?

c++ - C++ 中的运算符重载(有和没有 friend )

json - jq:当数组中有任何值时选择

class - 如何否定 Cytoscape.js 中的类选择器?

c - 发送信号和 pselect?

c - 递归函数在参数不为 NULL 时传递 NULL 指针

c - printf 中的一元运算符

c - 如何在 YACC 中编写后置自增/自减运算符的语法?

c# - 在 C# 中否定浮点值的最佳方法