我的代码在范围退出后需要我的循环计数器的值。因此,我在循环外初始化i
。
size_t i;
for (i = 0; i < size / 16 * 16; i += 16) {
// Magical unicorns.
}
但是,我很惊讶地看到i
的值将是最后一个有效值,而不是导致循环退出的值。
例如,如果我的size
为15,i
将为0(而不是我预期的16)。如果我的大小为17,则i
将为16(而不是32)。
我无法找到有关iteration_expression
此行为的cppreference信息。这是标准行为,还是铿锵有力?
答案 0 :(得分:4)
例如,如果我的大小为15,那么我将为0(而不是我预期的16)。如果我的大小为17,那么我将是16(而不是32)。
这不是整数除法在c
中的工作原理15/16 = 0
0次是0 ...所以i
不小于0 ..没有循环增量,没有循环。
答案 1 :(得分:0)
如果size
为15
,size / 16 * 16
的评估结果为0
,因为size / 16
因整数除法而评估为0
。
如果size
为17
,则size / 16 * 16
的评估结果为16
,因为size / 16
评估为1
。
如果您想要浮点除法,请使用i < size / 16.0 * 16
。请注意,第一个16
更改为16.0
,使其成为double
而不是int
。
答案 2 :(得分:0)
使用i += 16
会遇到整数除法引起的问题,但更重要的是,我认为根本不需要它。由于您使用的是size_t i;
for (i = 0; i < size; i += 16) {
// Magical unicorns.
}
,因此您只需:
size_t i;
for (i = 0; i*16 < size; i += 16) {
// Magical unicorns.
}
如果必须使用该逻辑,则使用起来会更简单:
localStorage.someKey = someValue;
localStorage["someKey"] = someValue;
localStorage.setItem("someKey", someValue);