gpt4 book ai didi

C 编程循环的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 20:29:06 25 4
gpt4 key购买 nike

我有一个程序,当 STEP 设置为 1 时,它可以向前和向后访问数组中的所有元素。当我设置 STEP = 2 时,如您所料,访问第 0 个字节,然后跳过两个字节,然后访问第 2 个字节,依此类推。当我再次设置 STEP = 3 时,向前和向后访问都是正确的。但是当我设置STEP = 4时,看起来向前行走是正确的,但向后行走却偏离了两倍。(也许)有趣的是,step = 5 也被破坏,STEP = 6 再次同步。我在这里缺少什么?

#include <stdio.h>
typedef signed int int32_t;
#define STRIDE 1
void WalkForward()
{
int32_t i;
int format = 0;
for (i = 128 - 1; i > 0; i -= STRIDE)
{
printf("[%3d], ",128 - i - 1);
if (format++ > 10){format = 0;printf("\n");}
}
printf("\n\n");
}
void WalkBackward()
{
int32_t i;
int format = 0;
for (i = 1; i < 128; i += STRIDE)
{
printf("[%3d], ", 128 - i - 1 );
if (format++ > 10) { format = 0; printf("\n"); }
}
printf("\n\n");
}
int main()
{
LOOP:
WalkForward();
WalkBackward();
goto LOOP;
}

以下是数据示例输出。 (抱歉示例太长,但我认为这是传达正在发生的事情的最佳方式。

STEP=1 (okay)
[ 0], [ 1], [ 2], [ 3], [ 4], [ 5], [ 6], [ 7], [ 8], [ 9], [ 10], [ 11],
[ 12], [ 13], [ 14], [ 15], [ 16], [ 17], [ 18], [ 19], [ 20], [ 21], [ 22], [ 23],
[ 24], [ 25], [ 26], [ 27], [ 28], [ 29], [ 30], [ 31], [ 32], [ 33], [ 34], [ 35],
[ 36], [ 37], [ 38], [ 39], [ 40], [ 41], [ 42], [ 43], [ 44], [ 45], [ 46], [ 47],
[ 48], [ 49], [ 50], [ 51], [ 52], [ 53], [ 54], [ 55], [ 56], [ 57], [ 58], [ 59],
[ 60], [ 61], [ 62], [ 63], [ 64], [ 65], [ 66], [ 67], [ 68], [ 69], [ 70], [ 71],
[ 72], [ 73], [ 74], [ 75], [ 76], [ 77], [ 78], [ 79], [ 80], [ 81], [ 82], [ 83],
[ 84], [ 85], [ 86], [ 87], [ 88], [ 89], [ 90], [ 91], [ 92], [ 93], [ 94], [ 95],
[ 96], [ 97], [ 98], [ 99], [100], [101], [102], [103], [104], [105], [106], [107],
[108], [109], [110], [111], [112], [113], [114], [115], [116], [117], [118], [119],
[120], [121], [122], [123], [124], [125], [126],

[126], [125], [124], [123], [122], [121], [120], [119], [118], [117], [116], [115],
[114], [113], [112], [111], [110], [109], [108], [107], [106], [105], [104], [103],
[102], [101], [100], [ 99], [ 98], [ 97], [ 96], [ 95], [ 94], [ 93], [ 92], [ 91],
[ 90], [ 89], [ 88], [ 87], [ 86], [ 85], [ 84], [ 83], [ 82], [ 81], [ 80], [ 79],
[ 78], [ 77], [ 76], [ 75], [ 74], [ 73], [ 72], [ 71], [ 70], [ 69], [ 68], [ 67],
[ 66], [ 65], [ 64], [ 63], [ 62], [ 61], [ 60], [ 59], [ 58], [ 57], [ 56], [ 55],
[ 54], [ 53], [ 52], [ 51], [ 50], [ 49], [ 48], [ 47], [ 46], [ 45], [ 44], [ 43],
[ 42], [ 41], [ 40], [ 39], [ 38], [ 37], [ 36], [ 35], [ 34], [ 33], [ 32], [ 31],
[ 30], [ 29], [ 28], [ 27], [ 26], [ 25], [ 24], [ 23], [ 22], [ 21], [ 20], [ 19],
[ 18], [ 17], [ 16], [ 15], [ 14], [ 13], [ 12], [ 11], [ 10], [ 9], [ 8], [ 7],
[ 6], [ 5], [ 4], [ 3], [ 2], [ 1], [ 0],

STEP=2 (okay)
[ 0], [ 2], [ 4], [ 6], [ 8], [ 10], [ 12], [ 14], [ 16], [ 18], [ 20], [ 22],
[ 24], [ 26], [ 28], [ 30], [ 32], [ 34], [ 36], [ 38], [ 40], [ 42], [ 44], [ 46],
[ 48], [ 50], [ 52], [ 54], [ 56], [ 58], [ 60], [ 62], [ 64], [ 66], [ 68], [ 70],
[ 72], [ 74], [ 76], [ 78], [ 80], [ 82], [ 84], [ 86], [ 88], [ 90], [ 92], [ 94],
[ 96], [ 98], [100], [102], [104], [106], [108], [110], [112], [114], [116], [118],
[120], [122], [124], [126],

[126], [124], [122], [120], [118], [116], [114], [112], [110], [108], [106], [104],
[102], [100], [ 98], [ 96], [ 94], [ 92], [ 90], [ 88], [ 86], [ 84], [ 82], [ 80],
[ 78], [ 76], [ 74], [ 72], [ 70], [ 68], [ 66], [ 64], [ 62], [ 60], [ 58], [ 56],
[ 54], [ 52], [ 50], [ 48], [ 46], [ 44], [ 42], [ 40], [ 38], [ 36], [ 34], [ 32],
[ 30], [ 28], [ 26], [ 24], [ 22], [ 20], [ 18], [ 16], [ 14], [ 12], [ 10], [ 8],
[ 6], [ 4], [ 2], [ 0],

STEP=3 (okay)
[ 0], [ 3], [ 6], [ 9], [ 12], [ 15], [ 18], [ 21], [ 24], [ 27], [ 30], [ 33],
[ 36], [ 39], [ 42], [ 45], [ 48], [ 51], [ 54], [ 57], [ 60], [ 63], [ 66], [ 69],
[ 72], [ 75], [ 78], [ 81], [ 84], [ 87], [ 90], [ 93], [ 96], [ 99], [102], [105],
[108], [111], [114], [117], [120], [123], [126],

[126], [123], [120], [117], [114], [111], [108], [105], [102], [ 99], [ 96], [ 93],
[ 90], [ 87], [ 84], [ 81], [ 78], [ 75], [ 72], [ 69], [ 66], [ 63], [ 60], [ 57],
[ 54], [ 51], [ 48], [ 45], [ 42], [ 39], [ 36], [ 33], [ 30], [ 27], [ 24], [ 21],
[ 18], [ 15], [ 12], [ 9], [ 6], [ 3], [ 0],

STEP=4 (broken)
[ 0], [ 4], [ 8], [ 12], [ 16], [ 20], [ 24], [ 28], [ 32], [ 36], [ 40], [ 44],
[ 48], [ 52], [ 56], [ 60], [ 64], [ 68], [ 72], [ 76], [ 80], [ 84], [ 88], [ 92],
[ 96], [100], [104], [108], [112], [116], [120], [124],

[126], [122], [118], [114], [110], [106], [102], [ 98], [ 94], [ 90], [ 86], [ 82],
[ 78], [ 74], [ 70], [ 66], [ 62], [ 58], [ 54], [ 50], [ 46], [ 42], [ 38], [ 34],
[ 30], [ 26], [ 22], [ 18], [ 14], [ 10], [ 6], [ 2],

STEP=5 (broken)
[ 0], [ 5], [ 10], [ 15], [ 20], [ 25], [ 30], [ 35], [ 40], [ 45], [ 50], [ 55],
[ 60], [ 65], [ 70], [ 75], [ 80], [ 85], [ 90], [ 95], [100], [105], [110], [115],
[120], [125],

[126], [121], [116], [111], [106], [101], [ 96], [ 91], [ 86], [ 81], [ 76], [ 71],
[ 66], [ 61], [ 56], [ 51], [ 46], [ 41], [ 36], [ 31], [ 26], [ 21], [ 16], [ 11],
[ 6], [ 1],

STEP=6 (back in sync)
[ 0], [ 6], [ 12], [ 18], [ 24], [ 30], [ 36], [ 42], [ 48], [ 54], [ 60], [ 66],
[ 72], [ 78], [ 84], [ 90], [ 96], [102], [108], [114], [120], [126],

[126], [120], [114], [108], [102], [ 96], [ 90], [ 84], [ 78], [ 72], [ 66], [ 60],
[ 54], [ 48], [ 42], [ 36], [ 30], [ 24], [ 18], [ 12], [ 6], [ 0],

最佳答案

向前倒数和向后倒数会让事情变得更加复杂。

简单一点 - 向前计数 - 向后计数:

#include <stdio.h>
typedef signed int int32_t;
#define STRIDE 6
#define LIMIT 127
void WalkForward()
{
int32_t i;
int format = 0;
for (i = 0; i < LIMIT; i += STRIDE)
{
printf("[%3d], ", i);
if (format++ > 10){format = 0;printf("\n");}
}
printf("\n\n");
}
void WalkBackward()
{
int32_t i = ((LIMIT-1)/STRIDE) * STRIDE;
int format = 0;
for (; i >= 0; i -= STRIDE)
{
printf("[%3d], ", i);
if (format++ > 10) { format = 0; printf("\n"); }
}
printf("\n\n");
}
int main()
{
WalkForward();
WalkBackward();
}

关于C 编程循环的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59000163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com