这个二增量表达式在 C 中定义良好吗?

问题描述 投票:0回答:2

我想通过跳过具有特定位集的所有整数来迭代整数到 2 的某个幂

t
。令
m
为 2 的幂(小于
t
),我想跳过所有整数
j
,使得
j&m != 0
。我喜欢下面的
for
循环,但我想知道它是否按照标准完美定义:

for (int j=0; j < t; j += (++j) & m) {
    ...
}

想法是:

  • 使用
    j
    递增
    ++j
    来迭代所有整数
  • 每当之前的增量设置了权重位
    m
    时,还添加
    m
    以跳过整个块。

但是由于同一个表达式中有两个增量,我想确保它完全正确。

c increment standards pre-increment
2个回答
2
投票

该程序的行为未定义(UB),因为修改和赋值之间没有序列点。

许多编译器会发出警告:

warning: unsequenced modification and access to 'j' [-Wunsequenced]
    |     for (int j=0; j < t; j += (++j) & m) {

即使可以,我也强烈建议你不要写这种“hacky”表达式,因为它们对于人类来说很难阅读。


0
投票

表达式

j += (++j) & m
调用 未定义行为,因为它试图在没有中间序列点的情况下多次写入
j

不要试图想出一个“聪明”的增量,只需在

for
语句中进行增量并在循环内部执行检查即可。

for (int j=0; j < t; ++j) {
    if ((j&m) != 0) {
        continue;
    }
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.