文号
t79730
阅读
3837
回复
1
收藏
1
奇怪的while(Expressions)
2016/04/26
IP:江苏
typedef struct _KEYBOARD_INPUT_DATA {
  
    //
    // Unit number.  E.g., for \Device\KeyboardPort0 the unit is '0',
    // for \Device\KeyboardPort1 the unit is '1', and so on.
    //
  
    USHORT UnitId;
  
    //
    // The "make" scan code (key depression).
    //
  
    char MakeCode;
  
    //
    // The flags field indicates a "break" (key release) and other
    // miscellaneous scan code information defined below.
    //
  
    USHORT Flags;
  
    USHORT Reserved;
  
    //
    // Device-specific additional information for the event.
    //
  
    ULONG ExtraInformation;
  
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;
  
typedef struct _WriteDataStruct
{
    UINT8 Command;
    UINT8 Data[];
}WriteData, *PWriteData;
  
typedef void(__stdcall*PUserRing0Fun)(); //C++函数指针
  
void UserFun()
{
    printf("被调用了!!!!!!!!!!!!");
}
  
typedef struct _ListData
{
    KEYBOARD_INPUT_DATA DATA;
    struct _ListData *Next;
}ListData, *PListData;
  
volatile PListData PldFirst;
volatile PListData *PPldLast;
//PListData *PldCurrent;
void Add(PListData ld)
{
    (*PPldLast) = (PListData)malloc(sizeof(ListData));
    (*PPldLast)->DATA.ExtraInformation = ld->DATA.ExtraInformation;
    (*PPldLast)->DATA.Flags = ld->DATA.Flags;
    (*PPldLast)->DATA.MakeCode = ld->DATA.MakeCode;
    (*PPldLast)->DATA.Reserved = ld->DATA.Reserved;
    (*PPldLast)->DATA.UnitId = ld->DATA.UnitId;
    (*PPldLast)->Next = nullptr;
    PPldLast = &((*PPldLast)->Next);
}
  
void Init()
{
    PldFirst = nullptr;
    PPldLast = &PldFirst;
}
volatile PListData ldNext;
BOOL RemoveFirst(void)
{
    if (PldFirst != nullptr)
    {
        ldNext = (PldFirst->Next);
        if (ldNext != nullptr)
        {
            free(PldFirst);
            PldFirst = ldNext;
            return TRUE;
        }
        else
        {
            free(PldFirst);
            PldFirst = nullptr;
            PPldLast = &PldFirst;
            return FALSE;
        }
    }
    else
    {
        return FALSE;
    }
}
  
int main()
{
    Init();
    ListData ld = {0};
      
    for (size_t i = 0; i < 3; i++)
    {
        ld.DATA.MakeCode = getchar();
        Add(&ld);
    }
      
    std::cout << PldFirst->DATA.MakeCode;
    RemoveFirst();
    //while (RemoveFirst()); //注意这里,如果RemoveFirst()在while括号中的话,执行后 PldFirst指向0
    {
        std::cout << PldFirst->DATA.MakeCode;
    }
    return 0;
}
std::cout << PldFirst->DATA.MakeCode;
 
while (RemoveFirst()); 
{
    std::cout << PldFirst->DATA.MakeCode; //PldFirst指向0
}
return 0;
std::cout << PldFirst->DATA.MakeCode;
RemoveFirst();
    std::cout << PldFirst->DATA.MakeCode; //PldFirst指针正常
return 0;
张静茹作者
10年7个月前IP:江苏
817369
1楼
额,没睡醒
while (RemoveFirst());
多了个分号

可是我只F11了一次呀,难道编译器优化掉了吗?
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的