我正在读取一个代码段,该段正在检查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
这种情况如何起作用?
答案 0 :(得分:0)
无符号整数表示数字为0或任何正数。在您的情况下,它正在检查变量width和height是否均为0或某个正整数。
侧面注意:Size_t是表示无符号整数的另一种数据类型。
答案 1 :(得分:-1)
首先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
永远都是假的。
这是一个错误。
检查流读取操作是否成功的正确方法是:
if (!(image >> img_format >> width >> height >> maxval))
// error
或等价物:
image >> img_format >> width >> height >> maxval;
if (!image)
// error