奇怪的while(Expressions)
张静茹2016/04/26软件综合 IP:江苏
<code class="lang-c">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;
}</code>
<code class="lang-cpp">std::cout << PldFirst->DATA.MakeCode;
 
while (RemoveFirst()); 
{
    std::cout << PldFirst->DATA.MakeCode; //PldFirst指向0
}
return 0;</code>
<code class="lang-cpp">std::cout << PldFirst->DATA.MakeCode;
RemoveFirst();
    std::cout << PldFirst->DATA.MakeCode; //PldFirst指针正常
return 0;</code>
来自:计算机科学 / 软件综合
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
张静茹 作者
8年8个月前 IP:江苏
817369
额,没睡醒
while (RemoveFirst());
多了个分号

可是我只F11了一次呀,难道编译器优化掉了吗?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
张静茹
进士 学者 机友 笔友
文章
139
回复
1869
学术分
1
2010/12/30注册,1个月23天前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}