C/C++编程笔记:C语言和C++中的未定义行为,及其优缺分析

考虑如下C / C ++程序并尝试猜想输出什么?程序员

举例一:编程

 

举例二:数组

 

举例三:安全

 

举例四:微信

 

举例五:性能

 

举例六:学习

 

举例七:优化

 

以上全部程序的输出都是不可预测的(或不肯定的)。编译器(实现C / C ++标准)能够自由地作任何事情,由于C和C ++标准未定义它们。spa

像Java这样的语言会当即发现错误,可是在少数状况下,像C和C ++这样的语言会继续以静默但有错误的方式执行代码,这可能会致使没法预测的结果。该程序可能会因任何类型的错误消息而崩溃,也可能在不知不觉中损坏数据的状况,这是一个严重的问题。3d

了解未定义行为的重要性

若是用户开始在C / C ++环境中学习而且对未定义行为的概念不清楚,那么未来可能会带来不少问题,例如在调试其余人的代码时可能实际上很难跟踪根目录。未定义的错误。

未定义行为

风险和缺点程序员有时依赖未定义行为的特定实现(或编译器),这可能会在更改/升级编译器时引发问题。例如,最后一个程序在大多数编译器中产生72做为输出,可是基于此假设实现软件不是一个好主意。

未定义的行为也可能致使安全漏洞,特别是因为未检查数组越界的状况(致使缓冲区溢出攻击)。

未定义行为的优势

C和C ++具备未定义行为,由于它容许编译器避免进行大量检查。假设一组具备较高性能数组的代码无需关注边界,这避免了须要复杂的优化过程来检查循环外的此类条件。当紧密绑定循环得到C编译器一般提供的带符号溢出的未定义性质的优势时,会将程序从30%加快到50%的速度。

咱们还有另外一个优势,由于它容许咱们将变量的值存储在处理器寄存器中,并在大于源代码中变量的时间内进行操做。它还有助于进行环绕检查,而后进行编译时检查,若是不更了解C / C ++编译器中的未定义行为,就没法进行检查。

但愿对你有帮助~

另外若是你想更好的提高你的编程能力,学好C语言C++编程!弯道超车,快人一步!笔者这里或许能够帮到你~

C语言C++编程学习交流圈子,QQ群1090842465点击进入】微信公众号:C语言编程学习基地

分享(源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比本身琢磨更快哦!

编程学习书籍分享:

编程学习视频分享:

相关文章
相关标签/搜索