使用if语句交换循环变量

时间:2013-09-14 05:41:13

标签: c++

我正在尝试更改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

3 个答案:

答案 0 :(得分:3)

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

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

以这种方式看待它;第一个版本开始在BuffPos + 3累积校验和。第二个版本开始累积来自BuffPos + (Start * Width) + 3的校验和。

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

如果您希望第二个版本与第一个版本相同,则需要将BuffPos初始化为Data + Start * Width或将这两个语句放在if中。当然,如果你这样做,那么在I == Start之前你根本就什么也不做,那应该告诉你一些事情。

答案 1 :(得分: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;

答案 2 :(得分:0)

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