使用 if 语句交换循环变量
Interchange loop variable with if statement
我正在尝试更改 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
,这应该告诉你一些事情。
这个版本怎么样?
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 语句下。
相关文章:
- 是否可以禁止在for循环体内部修改循环变量
- 使用 size_t 初始化循环变量时的整数下溢
- 在循环中重新声明 for 循环变量时出错
- 为什么这个循环变量在循环范围之外是可访问的
- 关于循环变量优化的标准合规行为是什么?
- 用于 C/C++ 中的循环变量优化
- C++循环变量按另一个变量递增
- 使用循环变量作为C++数组的索引
- 如何循环变量
- 如何在字符串(名称)中使用循环变量
- strlen函数与循环不兼容,循环变量不兼容
- 使用浮点/双精度作为循环变量
- C 或 C++ :表示循环变量
- 为循环变量声明键入 int32_t
- 使用 if 语句交换循环变量
- OpenMP中调度程序对循环变量的处理
- 对于C++中的循环-变量没有正确递增
- C++11 基于范围的 for 循环,无循环变量
- 在循环之外使用for循环变量是错误的吗?
- For循环变量无缘无故地下地狱