刷题时遇到的那些C++的”坑“
2022/7/28 14:34:00
本文主要是介绍刷题时遇到的那些C++的”坑“,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
break 与 continue
- 在循环语句中,break只能跳出一层循环,如果外边还有一层或者该循环代码后还有代码的话只break一下后续代码还会执行,这是你想要的效果吗???
- 循环语句中continue会跳过本次循环,但是去执行下一次循环,你确定自己的目的是这样吗???
- switch 语句中,default的情况下往往会执行break,这个语义是不符合上边的任何一种情况,不做任何行动,break只是跳出switch语句;
内存访问越界的情况实际很容易出现,使用容器并不能避免代码本身的问题
这段代码中,本意是tmpStr如果出现非数字的话跳出循环重新开始下一轮遍历,然而,break只能跳出本层for循环,所以实际上还是以空字符串向下执行了(外层的那个{实际上是比较懒用了{}分段处理,正常该封装成函数的)。向下执行的时候已经在计划之外了,此时的我判断这种意外会崩溃在 if (tmpStr[0] == 'A')
这行代码,呵呵,实际上崩溃在 std::cout << "tmpStr[i]:" << tmpStr[i] << "\t";
里面了。不对啊,字符串为空这个循环内的代码按理说不会执行啊?? 这又涉及到重要知识点“有符号和无符号整型问题,无符号整型变量0-1会变成最大的正整数啊!!!”,所以这个循环就进来了呢。
数据处理一定要保持一致性
比如,一个数组我们用的时候要么保持[), 要么保持[],不然处理的一塌糊涂
数组下标最大值不能与API接口中指定数组大小的参数混淆
下标计算从0开始,涉及到数组的接口往往会指定数组的大小,千万注意下标的最大值 = 数组大小 - 1,不然小则崩溃,大则接口输出结果不稳定,十分诡异,排查去吧。。。。。。
ASAN工具一定要用起来
编译的时候CXX_FLAGS增加-fsanitize=address -fsanitize-recover=all -fsanitize=leak
编译选项,则编译或者运行过程中出问题一下子就能指出代码错误的那一行,非常清晰!
这篇关于刷题时遇到的那些C++的”坑“的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升
- 2024-05-08代码报错不用愁,CodeGeeX一键完成代码修复、错误解释的功能上线了!