***** 专业、系统和创新的群发系列软件




c语言程序设计现代方法 - Powered By BBSXP
   www.168318.com -- 邮件营销-邮件群发,邮件地址搜索,地址验证其他论坛工作、生活、娱乐一个不能少c语言程序设计现代方法

发表新主题 回复帖子 您是本帖第 2495 个阅读者 适合打印机打印的版本 通过电子邮件发送此页面 添加加到IE收藏夹 报告本帖 浏览上一篇主题 浏览下一篇主题
 主题:c语言程序设计现代方法
asdgzw



等  级:工兵
经 验 值:3
社区金币:3
总发贴数:1
注册时间:2012/9/17
状  态:离线
信息 短讯 邮箱 主页 好友 搜索 引用 回复 No.1

c语言程序设计现代方法

  c语言程序设计:现代方法 第二版p44中有一段语句: i = 2; j = i*i++; 的问题。

  别听他们胡说 书上说得对 未定义行为指 在表达式[两个顺序点之间]里面 多次修改同一个变量

  用编译器得到同样的结果也说明不了什么

  i*i++ 是这样的做法

  那么编译器怎么实现就不好说了

  原文

  C语言标准明确说过:

  Undefined behavior:

  Between two sequence points, an object is modified more than once, or is modified and the prior value is read other than to determine the value to be stored (6.5).

  译文

  在序列点间

  多次修改同一个对象(i=++i/++i + ++i/ i++ + ++i/...)

  除当前修改的需要存储的值的以外再读取该值(i+i++/++i*i/...)

  或者说在修改的同时在别的表达式中再用这个对象

  是未定义的行为

  i*i++

  可以对应 在序列点之间 在当前修改需要存储的值以外再读取该值 后面的例子 有

  i+i++

  这个和你的i*i++ 雷同 2012-3-31 编译出来用debug步进跟踪看看,印象中应该先计算i*i,再自加,不是++i 2012-3-31 先进行自增运算,即先i++;后*,所以把i=2的值先赋值给i,再进行运行j=i*i,所以结果为4,最后再对i进行加一,所以运行后i的值为3 ,如果改为j=i*++i;结果就为6,因为先自增,所以自增后i的值为3了,再j=i*i,即为2*3

编辑:鸿运国际娱乐城


编辑 删除 发表时间:2017/2/25 16:54:30  IP: 已记录
收藏帖子 | 取消收藏 | 返回页首 
www.168318.com -- 邮件营销-邮件群发,邮件地址搜索,地址验证 - Powered By BBSXP



Powered by BBSXP 6.00 SP1 © 1998-2006
Script Execution Time:375ms