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 ...
随机推荐
- HTML: vertical algin Big/small div in same row (bootstrap)
Reference: http://stackoverflow.com/questions/20547819/vertical-align-with-bootstrap-3?answertab=vot ...
- JS 生成GUID 方法
var Guid={NewGuid: function () { var guid = (this._G() + this._G() +"-"+ this._G() +" ...
- 【二分】POJ 2109
谁骗我这是贪心TT 大概就是求k的n次方等于p时的k(k到10^9),由于,p的数据到了10^101,n到200,所以直接算估计T ?? 反正看完想到二分,其实数据要是再大点估计我这个二分不行. 网上 ...
- input type=file 图片上传相关
HTML: <input type="file" name="address" onchange='PreviewImage(this)' value ...
- ZeroMQ实例-使用ZMQ(ZeroMQ)进行局域网内网络通信
本文内容摘要:1)安装zeromq.2)实例说明使用zmq进行网络间的消息发送和接收 首先在机器中安装zmq库 步骤如下: 1)下载zeromq的源代码,ZeroMQ的官方网址:http://zero ...
- EF 5 最佳实践白皮书
Performance Considerations for Entity Framework 5 By David Obando, Eric Dettinger and others Publish ...
- mysql数据库安装及使用
前言:本文为在ubuntu系统下使用mysql数据库,mysql 版本为:Ver 14.14 Distrib 5.5.43 (mysql版本可在命令行中输入mysql --version显示) 一.m ...
- C# 内嵌其他程序到自己程序
写一xxx聊天机器人啊什么的可能会用到这种技术.比如把QQ窗体嵌入自己的winform中其实很简单,调用两个API函数即可. [DllImport("User32.dll ", E ...
- strace追踪mysql执行语句
一.strace参数 strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信息.追踪程序运行时的整个生命周期,输出每一个系统调用的名字,参数,返回值和 ...
- .Net深复制、浅复制
在.Net,大家都知道引用类型的深复制.浅复制吧. ,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制.若ob ...