使用 if 语句交换循环变量

Interchange loop variable with if statement

本文关键字:循环 变量 交换 语句 if 使用      更新时间:2023-10-16

我正在尝试更改 for 循环的开始变量以改用 if 语句。但是,它们似乎并不等同。

我有一个看起来像这样的循环:

int K = 0;
std::uint32_t CheckSum = 0;
const std::uint8_t* BuffPos = static_cast<const std::uint8_t*>(Data);
int Start = Height < 12 ? 1 : 12;
for (std::size_t I = Start; I < Height; ++I)
{
    for (std::size_t J = 0; J < Width; ++J, ++K)
    {
        BuffPos += 3;  //skip RGB and move to alpha pixel.
        CheckSum += *(BuffPos++);  //Checksum = count of alpha pixels.
    }
}
std::cout<<CheckSum;

但是,我不希望我的循环以I = Start开头。我宁愿在 if 语句中这样做。我尝试了以下方法:

int K = 0;
std::uint32_t CheckSum = 0;
const std::uint8_t* BuffPos = static_cast<const std::uint8_t*>(Data);
int Start = Height < 12 ? 1 : 12;
for (std::size_t I = 0; I < Height; ++I)
{
    for (std::size_t J = 0; J < Width; ++J, ++K)
    {
        BuffPos += 3; //Skip RGB and move to alpha pixel.
        if (I >= Start)  //The if statement.
            CheckSum += *(BuffPos++);  //Checksum = count of alpha pixels.
    }
}
std::cout<<CheckSum;

但是,带有 if 语句的第二个版本打印的数字与完全相同位图的第一个版本完全不同。

它这样做有什么原因吗?我该如何解决它?我不明白为什么它会有任何不同:S

正如你所注意到的,它不再相同。

当然,您

隔离了校验和位,但现在您递增BufPos不同的次数。 您的循环现在迭代了更多次,因此一旦您开始创建校验和BuffPos,它的值就与第一个版本中不同。

这样看;第一个版本开始在BuffPos + 3累积校验和。 第二个版本开始从BuffPos + (Start * Width) + 3累积校验和。

老实说,第一个版本更好。 我不能告诉你哪一个是正确的,但假设第一个版本是(从Start迭代),那么为什么要引入一个分支呢? 它只是混淆了代码。

如果您希望第二个版本与第一个版本相同,则需要初始化BuffPosData + Start * Width或将两个语句放在if中。 当然,如果你这样做,你只是什么都不做,直到I == Start,这应该告诉你一些事情。

这个版本怎么样?

int K = 0;
std::uint32_t CheckSum = 0;
const std::uint8_t* BuffPos = static_cast<const std::uint8_t*>(Data);
int Start = Height < 12 ? 1 : 12;
for (std::size_t I = 0; I < Height; ++I)
{
    if (I < Start)  //The if statement.
        continue; 
    for (std::size_t J = 0; J < Width; ++J, ++K)
    {
        BuffPos += 3; //Skip RGB and move to alpha pixel.
        CheckSum += *(BuffPos++);  //Checksum = count of alpha pixels.
    }
}
std::cout<<CheckSum;

两个语句(Buffpos 和 cheksum)都应该在 if 语句下。