我想通过跳过具有特定位集的所有整数来迭代整数到 2 的某个幂
t
。令 m
为 2 的幂(小于 t
),我想跳过所有整数 j
,使得 j&m != 0
。我喜欢下面的for
循环,但我想知道它是否按照标准完美定义:
for (int j=0; j < t; j += (++j) & m) {
...
}
想法是:
j
递增 ++j
来迭代所有整数m
时,还添加 m
以跳过整个块。但是由于同一个表达式中有两个增量,我想确保它完全正确。
该程序的行为未定义(UB),因为修改和赋值之间没有序列点。
许多编译器会发出警告:
warning: unsequenced modification and access to 'j' [-Wunsequenced]
| for (int j=0; j < t; j += (++j) & m) {
即使可以,我也强烈建议你不要写这种“hacky”表达式,因为它们对于人类来说很难阅读。
表达式
j += (++j) & m
调用 未定义行为,因为它试图在没有中间序列点的情况下多次写入 j
。
不要试图想出一个“聪明”的增量,只需在
for
语句中进行增量并在循环内部执行检查即可。
for (int j=0; j < t; ++j) {
if ((j&m) != 0) {
continue;
}
...
}