Оценка условного перехода - PullRequest
0 голосов
/ 26 мая 2020
const int IX(int x, int y, std::size_t width)
{
    if ((width * y + x) > 0)
    {
        return width * y + x;
    }
    else
    {
        return 0;
    }
}
const int IX(int x, int y, std::size_t width)
{
    int value = width * y + x;
    if (value > 0)
    {
        return value;
    }
    else
    {
        return 0;
    }
}

Здесь, если x=0 и y=-1 независимо от width, первая функция возвращает первую ветвь (почему?), А вторая возвращает то, что ожидается. Это ошибка компилятора или мне что-то не хватает? Я использую компилятор Visual Studio 2019.

1 Ответ

2 голосов
/ 26 мая 2020

Это основная демонстрация pu sh, позволяющая избавиться от беззнаковых типов, за исключением очень узких доменов (т.е. битовых манипуляций).

В вашей первой функции, где вы проверяете значение непосредственно в ветвь,

(width * y)

Учитывая, что width беззнаковое (size_t), результат этого также будет беззнаковым (в вашем случае, довольно большое значение), и, как таковой, всегда будет больше или равно нулю.

Во второй функции вы берете значение без знака и затем возвращаете его в знаковое:

int i = width * y

В результате оно снова становится подписанным, и теперь становится меньше 0.

Попробуйте включить предупреждения компилятора, и вы увидите их много.

...