C ++:为什么必须在if语句中放置一些函数?

时间:2016-07-13 15:39:13

标签: c++ function pointers position cursor-position

我将引用此答案:Get current cursor position

工作代码:

    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语句中放置这些函数会改变它们的运行方式?

2 个答案:

答案 0 :(得分:4)

它不会改变函数的运行方式。许多函数返回一个布尔值,指示操作是否成功。通过将函数调用包含在if中,您将自动检查操作是否成功。

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

答案 1 :(得分:3)

if (GetCursorPos(&p) && ScreenToClient(hwnd, &p))非常有害,但非常优雅。

由于&&运算符的短路性质,只有在ScreenToClient(hwnd, &p)成功运行时才会调用GetCursorPos(&p)(即返回转换为true)。后者如果成功,也会将p设置为对后续ScreenToClient来电有效的内容。

仅当两个功能都成功时才会运行封闭的if块。

您的崩溃很可能是因为hwnd未被初始化。