for循环iteration_expression值不会在循环退出时递增

时间:2018-03-04 05:42:03

标签: c++ for-loop

我的代码在范围退出后需要我的循环计数器的值。因此,我在循环外初始化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信息。这是标准行为,还是铿锵有力?

3 个答案:

答案 0 :(得分:4)

  

例如,如果我的大小为15,那么我将为0(而不是我预期的16)。如果我的大小为17,那么我将是16(而不是32)。

这不是整数除法在c

中的工作原理

15/16 = 0

0次是0 ...所以i不小于0 ..没有循环增量,没有循环。

答案 1 :(得分:0)

如果size15size / 16 * 16的评估结果为0,因为size / 16因整数除法而评估为0

如果size17,则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);