C ++: Почему некоторые функции должны быть помещены в операторы if?

Я буду ссылаться на этот ответ: Получить текущую позицию курсора

Рабочий код:

    HWND hwnd;
POINT p;
if (GetCursorPos(&p))
{
//cursor position now in p.x and p.y

}
if (ScreenToClient(hwnd, &p))
{
//p.x and p.y are now relative to hwnd's client area
cout << p.x << p.y;
}

Это компилируется, но вылетает, когда я нажимаю в окне:

    HWND hwnd;
POINT p;
if (GetCursorPos(&p) && ScreenToClient(hwnd, &p))
{
//cursor position now in p.x and p.y
cout << p.x << p.y;
}

Это также компилируется, но вылетает, когда я нажимаю в окне:

    HWND hwnd;
POINT p;
GetCursorPos(&p);
if (ScreenToClient(hwnd, &p))
{
//cursor position now in p.x and p.y
cout << p.x << p.y;
}

Зачем? Эти функции необычны в любом случае?

Это как-то связано с тем, что указатели задействованы?

Как разместить эти функции в if заявления меняются, как они работают?

-1

Решение

if (GetCursorPos(&p) && ScreenToClient(hwnd, &p)) довольно пагубно, но странно элегантно.

Из-за короткий circutting природа && оператор, ScreenToClient(hwnd, &p) будет вызываться только если GetCursorPos(&p) работает успешно (то есть возвращает что-то, что преобразуется в true). Последнее, в случае успеха, также может установить p к чему-то действительному для последующего ScreenToClient вызов.

Вмещающий if блок запускается только если и то и другое функции успешны.

Ваше крушение вполне может быть связано с вашим hwnd будучи неинициализированным.

3

Другие решения

Это не меняет работу функций. Многие функции возвращают логическое значение, указывающее, была ли операция выполнена успешно или нет. Заключая вызов функции в if, вы автоматически проверяете, прошла ли операция успешно.

   if(functionReturningSuccess(params))
{
//assume the operation succeeded
}
else
{
//report error
}
4

По вопросам рекламы [email protected]