C++ unsigned long类型和<
问题描述:
我有以下代码:C++ unsigned long类型和<
while(int()(uStartFrame - iFrameOffset) < 1)
{
iFrameOffset--;
}
uStartFrame和iFrameOffset都是无符号长,所以<说法是有点困难,我想。 但是,我认为我使用int()修复了它。 但循环运行不确定,所以我想这是行不通的。
有人可以帮忙吗?
谢谢!
答
while(uStartFrame < iFrameOffset + 1)
{
iFrameOffset--;
}
甚至更好
if(uStartFrame < iFrameOffset + 1)
iFrameOffset = uStartFrame - 1;
最后一行也显示出可能的错误。如果uStartFrame
是0
,那么没有unsigned long
变量x
可以满足uStartFrame == x + 1
。
答
演员是不对的,你应该投它这样,
(int)(uStartFrame - iFrameOffset) < 1
但这C样式转换是不是真的C++风格,在你的情况下,static_cast
最好:
static_cast<int>(uStartFrame - iFrameOffset) < 1
static_cast<unsigned long>(uStartFrame - iFrameOffset) < 1
除此之外,当您编写int()(x)
时,您可以定义一个返回整数并且不接受参数的函数,然后使用uStartFrame - iFrameOffset作为参数调用它。它甚至不应该编译,至少gcc 4.8正确地抱怨这个。
您的编译器显然会编译它,甚至可能会错误地将它视为一个返回未初始化整数的函数,最有可能为0,并且这可能解释了为什么您的循环永远运行。
答
您正在将测试(uStartFrame-iFrameOffset)转换为int,而不是iFrameOffset。所以,如果iFrameOffset很大(最大值可能是2^64-1--或者根据系统而不同),那么你可能需要2^64个循环才能结束。
这可能高达千兆秒。所以,你应该重新思考这个循环。这不是一个好主意。
你为什么投(应该是(int)这样)他们?由于它们是同一类型,因此无关紧要。 – Araw
此循环打算实现什么? (我猜'iFrameOffset'初始时大于'uStartFrame'?) – jrok