c - 这段C代码是什么意思? [短路评估]

标签 c logical-operators short-circuiting

Jeffrey Stedfast 出价 several functions that calculates the nearest power of 2 .其中一个函数的代码如下:

static uint32_t
nearest_pow (uint32_t num)
{
  uint32_t j, k;
  (j = num & 0xFFFF0000) || (j = num); // What is this?
  ...
}

为了完全理解代码,我尝试将行更改为:

  j = num & 0xFFFF0000;
  j = j | (j = num);

一不小心,我得到了正确的结果。但是,当我将这种转换应用于下一行(不包括在我的报价中)时,我得到了错误的结果。原来是我理解错了代码的意思。

(j = num & 0xFFFF0000) || 是什么意思(j = num);?

实际上,我需要将函数转换为其他编程语言。

最佳答案

|| 是逻辑或运算符。它具有短路行为,如果左侧为真,则不评估右侧(因为逻辑 or 的结果已经从真正的左侧已知为真)。

在这种情况下,如果第一个赋值 j = num & 0xFFFF0000 为零(“false” ).因此,首先将num 的高两个字节(掩码0xFFFF0000)分配给j。如果这是零(“假”),即高两个字节没有任何 1 位,则将 num 分配给 j

实际上,这意味着“如果 num 的高两个字节非零,则将其分配给 j,否则将较低的分配给 j两个字节的 num”。

关于c - 这段C代码是什么意思? [短路评估],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31232490/

相关文章:

c++ - ((int) 和 (int(a)) 之间有什么区别?

c - 如何知道编译器是否执行内存对齐?

c - 将参数作为空指针传递给 OS-iii 中的新线程

math - 我需要帮助找到逻辑门的数学表达式

python - Pandas 数据框中的逻辑或/按位或

Swift 短路与逻辑运算符不按预期工作

编译器错误 : implicit declaration of function 'find_task_by_vpid'

javascript - "&"和 "&&"运算符有什么区别?它们的用途是什么?

c - () 的优先级最高,为什么会短路?

c# - 如何使乘法运算符(*)表现为短路?