我正在尝试更改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迭代),那么为什么要引入一个分支呢?它只是弄乱了代码。

如果要使第二个版本与第一个版本相同,则需要将BuffPos初始化为Data + Start * Width或将两个语句都放在if中。当然,如果您这样做,直到I == Start之前您什么都不做,这应该可以告诉您一些信息。

关于c++ - 使用if语句交换循环变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18798714/

10-11 22:00
查看更多