我正在读一段代码,它检查ppm文件中的一些值是否正确。这些值是这样读取的:
image >> img_format >> width >> height >> maxval;然后,为了检查宽度和高度是否正确,使用以下命令:
if (width != unsigned int(width) && height != unsigned int(height))
{
cerr << "Width and/or height of the image are missing." << endl;
exit(EXIT_FAILURE);
}**width和height声明为unsigned int
这种情况是如何工作的?
发布于 2018-11-30 21:47:44
首先,unsigned int(width)是非法语法。也许有一个编译器的扩展允许它(我已经检查了clang和gcc,都不允许它,即使用gnu++也不允许)。有几种方法可以正确地写出这个造型:
(unsigned int)(width)
unsigned(width)
static_cast<unsigned int>(width)
static_cast<unsigned(width)建议使用static_cast。
现在,假设使用上面的一种方式来编写您的条件,它不会做任何事情。witdth和height都是unsigned int类型,所以强制转换绝对不做任何事情,因此比较结果等同于:
width != width这将永远是假的。
所以它是一个bug。
检查流读取操作是否成功的正确方法是:
if (!(image >> img_format >> width >> height >> maxval))
// error或等效的:
image >> img_format >> width >> height >> maxval;
if (!image)
// errorhttps://stackoverflow.com/questions/53556856
复制相似问题