2.1 位运算

  位运算的运算对象是整数类型的,并且把运算对象看成是一个二进制位的集合。运算对象可以是带符号也可以是无符号。如果是带符号且值为负,那么位运算如何处理运算对象的符号位依赖于机器。而且此时的左移操作可能会改变符号位的值。因此会产生未定义的行为。

关于符号位如何处理C++标准没有明确规定,所以强烈建议将位运算用于处理无符号类型。因此,在使用位运算的过程中,因尽量将对象声明为无符号的,如:unsigned char、unsigned int 等。

2.2  求值顺序、运算符执行顺序、表达式

对于没有指定执行顺序的运算符,如果表达式指向并修改了同一个对象,会引发错误并产生未定义的行为。

比如int i=f1()*f2();该表达式的乘法运算符没有指定运算的顺序,所以,这里是f1()先执行还是f2()先执行是未定义的、未知的,f1()和f2()谁先执行取决于编译器如何处理。

2.3 避免无法预知和依赖于实现环境的行为

无法预知的行为源于编译器无须检测的错误。即使代码编译通过了,如果程序执行了一条未定义的表达式,仍有可能产生错误。

2.4类型转换、赋值

当赋值给带符号类型一个超过它表示范围的值时,结果是未定义的,程序可能继续工作,可能崩溃也可能生成数据垃圾。

2.5 函数的参数列表

实参与形参存在一一对应的关系,但是并没有规定实参的求值顺序,编译器可以任意可行的顺序对参数求值。这个与连乘的性质有些类似。连乘也没有规定求值得顺序,因此在使用的过程中,需要注意求值顺序是否对结果有影响,不要想当然的认为参数列表是从左到右或者从右到左的对表达式进行求值。

2.6 函数返回值

当函数具有非空的返回值时,如果函数的每一条执行路径中,有一条或多条路径可能没有相应的return语句,则可能会产生未定义的行为。当然,这种情况有可能编译器可以检测到并且给出相应的提示。但如果编译器未检测到,则该函数在运行时的行为将是未定义的。

2.7 返回局部对象的引用或指针

函数执行完之后,它所占用的存储空间也被释放掉。所以,函数终止意味着局部变量的引用将指向不再有效的内存区域。例如下面的例子:

Int & getid()
{int i=0;i=10;if(i>5){return I;}else{return -1;}
}

试图使用上面这个函数的返回值将引发未定义的行为。

上面是一个返回局部对象的引用的例子。同样的,返回局部对象的指针也是错误。因为函数结束后,局部对象所占的空间被释放,指针将指向一个不存在的对象。

转载于:https://www.cnblogs.com/xiongmao-cpp/p/5243308.html

C++中的未定义的行为相关推荐

  1. CSS中的未定义行为,浏览器的差异(一)

    今天看了张鑫旭大佬的新书的有感吧,记录一下. Web标准未对一些场景做出明确规范,所以各大浏览器厂家只能根据自己的理解和喜好去实现,表现差异不是浏览器的bug,用计算机领域的术语描述为"未定 ...

  2. java中方法未定义_java - Java SE中的未定义方法错误 - 堆栈内存溢出

    我为该问题写了一个代码http://www.spoj.com/problems/PRIME1/ ,该代码的作用是将输入以字符串形式输入,然后将split()拆分为两个整数,并存储在该数组中.然后返回到 ...

  3. VSCode中出现未定义标识符,可以找到引用但是依旧标红

    /*下边两个如果不添加,未定义引用,但是会出现标红*/ // "C_Cpp.intelliSenseEngineFallback": "Disabled", / ...

  4. php类中使用未定义的属性说明

    一般情况下,在类中要使用一个属性,最好是先申明这个属性.否则就是给自己的挖坑了. 先来看以下一段代码, <?php class test_class{public function out(){ ...

  5. C程序中的未定义行为(Undefined Behavior)

    什么是UB LLVM IR和C语言中都有UB的概念.很多在C语言中看似合理的事都可能导致UB,UB是代码中很多BUG的源泉. UB在C或类C语言中存在的原因是因为追求极致的性能.类似JAVA之类的语言 ...

  6. matlab中出现未定义函数或变量如何解决?

    A=[0 -1 4;9 -14 25;-34 49 64]; B=zeros(3,3); for i=1:3 for j=1:3 B(i,j)=A(i,j); end end disp(B) 复制j矩 ...

  7. g linux 未定义的引用_G ++ Cpp中的“未定义的引用”

    似乎无法使错误消失.错误如下.我已经看过Google了,但仍然想不起来.并不是我不是Cpp的新手,但有一段时间没有被它弄糊涂了. 奇怪的是它与Windows中的G ++一起使用... 错误: [ze ...

  8. linux c 编译 未定义的引用,c – Linux makefile中的未定义引用

    我想在linux下构建我的应用程序,但我无法使用我的makefile来实现它. 问题是我要链接的静态库.我得到了很多"未定义的引用"错误消息,如: undefined refere ...

  9. html显示未定义,(X)HTML中的未定义行为?

    这比检查 Yi Jiang和 mu is too short给出的DTD稍微复杂一些. 的确,XHTML 1.0 DTD明确禁止< a>元素作为< button>元素在您的问题 ...

最新文章

  1. 错过CVPR 2017?绝对不能错过GAIR大讲堂——上海交大专场开启报名
  2. C#中使用SendMessage进行进程通信,可发送字符串,结构体(不能发送类类型)。
  3. 前端学习(2042)vue之电商管理系统电商系统之优化生成打包报告
  4. C#不支持XPATH2.0
  5. 洛谷 - P1012 - 拼数 - 排序
  6. python traceback报错_怎么屏蔽Python Traceback错误信息
  7. 免费下载《程序员面试宝典》.pdf
  8. php 上传微信媒体,关于微信公众号API多媒体上传
  9. 广告终结者:使用AdBlock Plus屏蔽百度、CSDN广告
  10. Qt5设置应用程序图标报错Debug Error 1
  11. 解决 | 点击任务栏没有反应
  12. URAL1325-Dirt
  13. opc java_Java OPC 代码
  14. 解决 Error starting userland proxy: listen tcp 0.0.0.0:6379: bind: address already in use
  15. 稻城亚丁徒步攻略,与你共同感受这片净土
  16. Linux下自动化运维工具ansible
  17. 一度智信在拼多多上开店靠谱吗?
  18. QQ隐藏福利一------------------------文件极速下载
  19. L2-3.名人堂与代金券
  20. c语言;文件名批量修改要求可以修改整个文件内文件名或后缀名自动,ubuntu批量修改文件名字(换动画资源必用)...

热门文章

  1. ArchLinux简明安装教程
  2. LeetCode 744. Find Smallest Letter Greater Than Target
  3. 蓝桥杯 BASIC-13 基础练习 数列排序
  4. openwrt 编译c语言,编译一个可以运行在openwrt上的c程序
  5. python禁用键盘鼠标_在Python中禁用或锁定鼠标和键盘?
  6. Spring 学习系列 -- Spring + Mybatis 从零开始配置多数据源访问
  7. python3爬虫-通过requests爬取图虫网
  8. 使用System Center Essentials 2007进行软件部署
  9. Maven pom.xml配置详解
  10. NSNumber的使用