浅谈C和C++中的顺序点和副作用.doc_第1页
浅谈C和C++中的顺序点和副作用.doc_第2页
浅谈C和C++中的顺序点和副作用.doc_第3页
浅谈C和C++中的顺序点和副作用.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

浅谈C/C+中的顺序点和副作用C/C+中有一个叫做顺序点(Sequence Point)的概念,通常我们并没有必要去了解和深究。但如果掌握了顺序点的概念,一些晦涩的表达式(比如某些无聊的面试题目)可能就会变得简单明了了。为了介绍顺序点,就不得不提到副作用(Side Effect)。一.副作用(side effect)表达式有两种功能:每个表达式都产生一个值( value ),同时可能包含副作用( side effect )。副作用是指改变了某些变量的值。如:1:20 /这个表达式的值是20;它没有副作用,因为它没有改变任何变量的值。2:x=5 / 这个表达式的值是5;它有一个副作用,因为它改变了变量x的值。3:x=y+ / 这个表示有两个副作用,因为改变了两个变量的值。4:x=x+ / 这个表单时也有两个副作用,因为变量x的值发生了两次改变。二.求值顺序点表达式求值规则的核心在于 顺序点( sequence point ) C99 6.5 Expressions 条款2 C+03 5 Expressions 概述 条款4 。顺序点的意思是在一系列步骤中的一个“结算”的点,语言要求这一时刻的求值和副作用全部完成,才能进入下面的部分。在C/C+中只有以下几种存在顺序点:1)分号;2)未重载的逗号运算符的左操作数赋值之后(即,处)3)未重载的|运算符的左操作数赋值之后(即|处);4)未重载的&运算符的左操作数赋值之后(即&处);5)三元运算符? : 的左操作数赋值之后(即?处);6)在函数所有参数赋值之后但在函数第一条语句执行之前;7)在函数返回值已拷贝给调用者之后但在该函数之外的代码执行之前;8)每个基类和成员初始化之后;9)在每一个完整的变量声明处有一个顺序点,例如int i, j;中逗号和分号处分别有一个顺序点;10)for循环控制条件中的两个分号处各有一个顺序点。对于任意一个顺序点,它之前的所有副作用都已经完成,它之后的所有副作用都尚未发生。在两个顺序点之间,子表达式求值和副作用的顺序是不同步的。如果代码的结果与求值和副作用发生顺序相关,称这样的代码有不确定的行为(unspecified behavior).而且,假如期间对一个内建类型执行一次以上的写操作,则是未定义行为.任意两个顺序点之间的副作用的发生顺序都是未定义的.如:1. x=x+;该表达式只有一个顺序点,在该顺序点之前有2个副作用,一个是自增,一个赋值,这两个副作用发生的顺序是未定义的,即自增运算和赋值运算哪一个先执行是没有被定义的(注意这个顺序跟运算符的优先级是无关的,注意理解运算符优先级的含义),这个执行次序交由编译器厂商去自行决定,因此对于不同的编译器可能会得出不同的结果。1. #include 2. #include 3. intmain(intargc,char*argv) 4. 5. inti=0; 6. intm=(+i)+(+i)+(+i)+(+i); 7. printf(%d%dn,m,i); 8. system(pause); 9. return0; 10. 对于上述代码:在gcc编译器中运行得到的结果是 11 4而在Visual Studio 2008中运行得到的结果是 16 4因为对于1. inti=0; 2. intm=(+i)+(+i)+(+i)+(+i);在两个分号之间有5个副作用,这5个副作用与子表达式的求值顺序是未定义的,对于不同的编译器会得出不同的结果。并且在这期间对i进行了不止一次的写操作,这也是一个未定义的行为,可能会引起任何后果。还比如:1. xi=i+; 2. printf(%d%dn,i+,i+); 3. function(x,x+);这些都是未定义的行为。因此我们平时在写代码时,尽量不要写出这样风格不好的代码,因为它不仅会给程序带来不确定性,可能会引起任何后果(比如程序崩溃),而且对于代码的移植性来说是致命的打击。比如:1. xi=i+;可以用这段代码去代替:1. xi=i; 2. i+; 3. function(x,x+);-funct

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论