C++中的"未定义的行为"
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++中的"未定义的行为"的更多相关文章
- 从架构层面杜绝lua中使用未定义的变量
# 从架构层面杜绝lua中使用未定义的变量 标签(空格分隔): lua --- lua中有一个很坑的地方:1.就是如果一个变量拼写错误,会自动的认为你定义了一个值为nil的全局变量.2.如果在func ...
- WPF/UWP 的 Grid 布局竟然有 Bug,还不止一个!了解 Grid 中那些未定义的布局规则
只要你用 XAML 写代码,我敢打赌你一定用各种方式使(nuè)用(dài)过 Grid.不知你有没有在此过程中看到过 Grid 那些匪夷所思的布局结果呢? 本文将带你来看看 Grid 布局中的 Bu ...
- 情景剧:C/C++中的未定义行为(undefined behavior)
写在前面 本文尝试以情景剧的方式,轻松.直观地解释C/C++中未定义行为(undefined behavior)的概念.设计动机.优缺点等内容1,希望读者能够通过阅读本文,对undefined beh ...
- strcasecmp在VS2010中提示未定义标识符
分析: strcasecmp(*,*)是用来比较字符串,定义在string.h头文件中,但是在windows下即使添加string.h头文件,依然会报错. 解决: 添加 #if defined(_MS ...
- javascript中的未定义和未声明
我们在项目中,经常会定义一些变量(很多时候,定义过多的全局变量),当我们调用这些变量的时候,就会发生各种各样的突发状况. 看一个示例: var a; typeof a; typeof b; 很简单的一 ...
- C语言undefined behaviour未定义行为
C语言中的未定义行为(Undefined Behavior)是指C语言标准未做规定的行为.同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又 ...
- js在函数中未定义的变量的处理
<html> <head> <script type="text/javascript"> var z=1; function abc(){ x ...
- 一种KEIL中定义过的变量在使用中提示未定义的情况
[环境] > KEIL5.25 > win10 > @2018-4-23 [问题] 头文件互包含导致的错误(使用了另一文件的类型定义) 文件<fileA.h> <f ...
- 在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 :
1 在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 : dlg1.h(23) : error C2065: 'IDD_DIALOG1' : und ...
随机推荐
- WIN32/API/SDK/MFC四者之间的联系和区别
上面大家都说Win32是一个子系统,这个当然是对的,不过我们有时候我们所说Win32通俗的就是指32位的Windows系统,从 windows95/98到NT/2000/XP都是32位Windows. ...
- 用Less CSS定义常用的CSS3效果函数
定义圆角及调用 /* 定义圆角 @radius 圆角大小 */ .round(@radius:5px){ border-radius:@radius; -webkit-border-radius: @ ...
- HDU3333 Turing Tree(线段树)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=3333 Description After inventing Turing Tree, 3x ...
- 踩坑事件:windows操作系统下的eclipse中编写SparkSQL不能从本地读取或者保存parquet文件
这个大坑... .... 如题,在Windows的eclipse中编写SparkSQL代码时,编写如下代码时,一运行就抛出一堆空指针异常: // 首先还是创建SparkConf SparkConf c ...
- Discuz!用户注册,登陆,生成帖子功能实现
<?php /* * Disucz!部分功能使用说明: */ /***************************************************************** ...
- BFC给我的帮助以及对hasLayout的认识
布局的时候经常想让一个或几个元素并并排的放在一起,有时给其中的一个浮动,元素是在一行了,可还是都左边重叠了,总是这样那样改来改去,小白的我也是醉了! 今天偶然间看到了了BFC这个东东,虽然现在还是不是 ...
- LinkedList实现队列和堆栈的代码
package 集合; import java.util.LinkedList; /* *队列:先进先出 *把romovelast改成romoveFirst就成了堆栈 先进后出 * * */publ ...
- Javascript学习之无缝滚动
无缝滚动Javascript: <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- 用php实现一个敏感词过滤功能
周末空余时间撸了一个敏感词过滤功能,下边记录下实现过程. 敏感词,一方面是你懂的,另一方面是我们自己可能也要过滤一些人身攻击或者广告信息等,具体词库可以google下,有很多. 过滤敏感词,使用简单的 ...
- Web存储-Web Storage
/* // 如下是initStorageEvent()方法参数,其中两个参数我默认写成false了,一般都不用改动 initStorageEvent(eventType, false, false, ...