Значение int n! = Unsigned int (n) - PullRequest
       42

Значение int n! = Unsigned int (n)

0 голосов
/ 30 ноября 2018

Я читал сегмент кода, который проверял, верны ли некоторые значения из 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

Как работает это условие?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Unsigned int означает, что число равно 0 или любому положительному числу.В вашем случае он проверяет, что переменные width и height равны 0 или некоторому положительному целому числу.

Примечание: Size_t - это другой тип данных, представляющий целые числа без знака.

0 голосов
/ 30 ноября 2018

Прежде всего unsigned int(width) - это недопустимый синтаксис.Возможно, есть расширение для компилятора, позволяющего это (я проверил и clang, и gcc, и ни один не разрешил это, даже с gnu++).Есть способы правильно написать это приведение:

(unsigned int)(width)
unsigned(width)
static_cast<unsigned int>(width)
static_cast<unsigned(width)

Рекомендуется static_cast s.

Теперь, предполагая, что один из описанных выше способов написания вашего условия ничего не делает.Вы, кстати, witdth и height типа unsigned int, поэтому приведение абсолютно ничего не делает, поэтому сравнение эквивалентно:

width != width

, которое всегда будет ложным.

Итакэто ошибка.


Правильный способ проверить, была ли успешной операция чтения потока:

if (!(image >> img_format >> width >> height >> maxval))
    // error

или эквивалент:

image >> img_format >> width >> height >> maxval;

if (!image)
    // error
...