如何在调试中判断C++逻辑与运算符的哪个操作数为假?
如何在调试时判断C++逻辑与运算中哪个操作数为假?
给定代码:
auto found = std::lower_bound(container.begin(), container.end(), val); return found != container.begin() && found != container.end();
想要调试时确定&&的左、右操作数哪个为假,或是两者都为假,但使用gdb的print命令查询时遇到报错:
(gdb) p found != container.end() Cannot resolve function operator!= to any overloaded instance
可以用以下几种方法解决:
分步打印迭代器底层值
多数容器的迭代器(比如std::vector的迭代器)本质是指针或封装了指针,直接打印迭代器的底层地址就能手动对比:p found p container.begin() p container.end()对比输出的地址值,就能知道
found != container.begin()和found != container.end()的真假。显式调用重载的
operator!=
如果迭代器的不等运算符是成员函数,直接显式调用:p found.operator!=(container.begin()) p found.operator!=(container.end())如果是非成员函数重载,直接指定参数调用:
p operator!=(found, container.begin())拆分为临时变量调试
利用&&的短路特性,直接把两个条件拆成临时变量,重新编译后调试:bool cond1 = found != container.begin(); bool cond2 = found != container.end(); return cond1 && cond2;调试时直接打印
cond1和cond2的值,结果一目了然。用
call命令替代print
gdb的call命令处理重载运算符的兼容性更好,执行后会返回布尔结果(0为假,非0为真):call found != container.begin() call found != container.end()
内容的提问来源于stack exchange,提问作者siga
相关产品推荐
相关产品推荐

