0

我正在尝试将 for 循环的 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 = 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

4

3 回答 3

3

正如你所注意到的,它不再一样了。

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

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

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

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

于 2013-09-14T05:46:06.320 回答
1

这个版本怎么样?

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;
于 2013-09-14T05:54:41.543 回答
0

两个语句(Buffpos 和 cheksum)都应该属于 if 语句。

于 2013-09-14T05:50:28.107 回答