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=;
i=;
if(i>)
{
return I;
}
else
{
return -;
}
}

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

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

C++中的"未定义的行为"的更多相关文章

  1. 从架构层面杜绝lua中使用未定义的变量

    # 从架构层面杜绝lua中使用未定义的变量 标签(空格分隔): lua --- lua中有一个很坑的地方:1.就是如果一个变量拼写错误,会自动的认为你定义了一个值为nil的全局变量.2.如果在func ...

  2. WPF/UWP 的 Grid 布局竟然有 Bug,还不止一个!了解 Grid 中那些未定义的布局规则

    只要你用 XAML 写代码,我敢打赌你一定用各种方式使(nuè)用(dài)过 Grid.不知你有没有在此过程中看到过 Grid 那些匪夷所思的布局结果呢? 本文将带你来看看 Grid 布局中的 Bu ...

  3. 情景剧:C/C++中的未定义行为(undefined behavior)

    写在前面 本文尝试以情景剧的方式,轻松.直观地解释C/C++中未定义行为(undefined behavior)的概念.设计动机.优缺点等内容1,希望读者能够通过阅读本文,对undefined beh ...

  4. strcasecmp在VS2010中提示未定义标识符

    分析: strcasecmp(*,*)是用来比较字符串,定义在string.h头文件中,但是在windows下即使添加string.h头文件,依然会报错. 解决: 添加 #if defined(_MS ...

  5. javascript中的未定义和未声明

    我们在项目中,经常会定义一些变量(很多时候,定义过多的全局变量),当我们调用这些变量的时候,就会发生各种各样的突发状况. 看一个示例: var a; typeof a; typeof b; 很简单的一 ...

  6. C语言undefined behaviour未定义行为

    C语言中的未定义行为(Undefined Behavior)是指C语言标准未做规定的行为.同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又 ...

  7. js在函数中未定义的变量的处理

    <html> <head> <script type="text/javascript"> var z=1; function abc(){ x ...

  8. 一种KEIL中定义过的变量在使用中提示未定义的情况

    [环境] > KEIL5.25 > win10 > @2018-4-23 [问题] 头文件互包含导致的错误(使用了另一文件的类型定义) 文件<fileA.h> <f ...

  9. 在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 :

    1    在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 : dlg1.h(23) : error C2065: 'IDD_DIALOG1' : und ...

随机推荐

  1. 首师大附中互测题:50136142WXY的坑爹百度地图【B006】(可以喝的超大桶水)

    [B006]50136142WXY的坑爹百度地图[难度B]——————————————————————————————————————————————————————————————————————— ...

  2. [NOIP2011]Mayan游戏 题解

    题目大意: 有一个5*7的方格,上面有几种颜色的方块,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除,方块消除之后,消除位置之上的方块将掉落.每步移动可以且仅可以沿横向 ...

  3. Bug整理——$(window).height()获取到$(document).height()的问题

    想看解决方案不想看无聊乏味的bug解决过程的同学,请直接跳转到页面底部~ 今天在做项目的过程中遇到了一个BUG,项目中需要获取到浏览器客户区的高度以方便做一些适应性调整,代码如下: $(documen ...

  4. LINUX内核参数FS与VM相关

    文件系统相关 fs.aio-nr = 0 当前aio请求数 fs.aio-max-nr = 1048576 最大允许的aio请求数 fs.file-nr = 3456 0 94159 已分配的文件ha ...

  5. spring自定义schema学习

    [转载请注明作者和原文链接,欢迎讨论,相互学习.] 一.前言 1. 最近在学习dubbo,里边很多如provider.consumer.registry的配置都是通过spring自定义Schema来实 ...

  6. google jquery用不了啦,你准备好了吗

    今天,相信很多网站开发人员都有这感觉,明明正常的页面却无法工作了,莫名其妙的错误,笔者也遇到这种错误,细查之下才发现google jquery用不了啦,通过firefox调试发现找不到jquery了, ...

  7. Assertion failure in -[UITableView _classicHeightForRowAtIndexPath:], /SourceCache/UIKit_Sim/UIKit-3318/UITableView.m:10772

    Assertion failure in -[UITableView _classicHeightForRowAtIndexPath:], /SourceCache/UIKit_Sim/UIKit-3 ...

  8. ZK listbox 两种分页使用及比较

    参考:http://tsinglongwu.iteye.com/blog/849923 以下代码模拟数据量大时情况,采用“<paging>”组件方式 前台Listbox.zul : < ...

  9. 规范和封装jdbc程序代码

    JDBC 部分方法引用工具类 package it.cast.jdbc; import java.sql.Connection; import java.sql.DriverManager; impo ...

  10. mysql 主主互备

    双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步.对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致. 这样做的好处多. 1. 可以做灾备,其中一个坏了可以切换到 ...