100分 讨论

zzyjsjcom 2007-09-27 08:07:51
大家说说 c语言的未定义行为??
...全文
189 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzyjsjcom 2007-09-28
  • 打赏
  • 举报
回复
大家到下面这个连接 回两贴, 给错分了,但没其他人回贴,我结不了贴啊.....
http://community.csdn.net/Expert/TopicView3.asp?id=5776445
星羽 2007-09-27
  • 打赏
  • 举报
回复

未定义行为顾名思义就是标准没有对其作出具体规定的行为。比如“fclose 两次”其行为就是一个未定义行为。

对于未定义行为,标准允许编译器可以任意定义一个具体实现,因此这样的行为其结果不是确定的。比如对于上述未定义行为,其具体实现可以是:fclose函数返回错误码、出现段错误程序终止、或者任何其它可能的实现。

由于未定义行为会使程序出现不确定的运行结果从而达不到程序的预定目的,所以这不是我们所希望出现的。因此,一定不要让未定义行为出现在程序中,这是程序员的一个基本职责。比如,“fclose 两次”这个行为会导致未定义行为,那么在程序中就绝对要避免出现“fclose 两次”这样的错误。

对于程序员来说,导致未定义行为产生的行为(如“fclose 两次”)其实就是标准的禁止事项。如果未定义行为在程序中出现了,说明这个程序违反了标准的规定,是非法程序。
星羽 2007-09-27
  • 打赏
  • 举报
回复
去看看这个文章,为定义东西太多了



http://blog.chinaunix.net/u/17660/showart.php?id=302210

星羽 2007-09-27
  • 打赏
  • 举报
回复
上面


这段代码在运行时会出错,而编译时连警告也没有。一上来我们就会想到是test的问题,一定是类型不匹配。

那么,为什么前后两个test的类型不匹配呢?很简单,从数组到指针的转换是隐式的,但是前提是编译器能够根据上下文判断出需要这种转换。由于C++编译器一次只编译一个源文件,所以,在编译的时候没有足够的信息告诉编译器来进行这种转换,出错是必然的。

既然不匹配,为什么不发出警告呢?因为这是一个未定义的行为!在C++中,编译器没有责任来提示未定义的行为。甚至编译器可能根本认不出未定义的行为。至于链接器的行为,也是如此。

星羽 2007-09-27
  • 打赏
  • 举报
回复


/*******************************************/
/* file foo.cc */


extern char test[] = "helloworld";


/*********************************************/
/* file bar.cc */


#include <iostream>


extern char* test; /* this line will be commented later. */
// extern char test[]; /* this line will be uncommented later. */


int main()
{
std::cout << test << std:: endl;



}
星羽 2007-09-27
  • 打赏
  • 举报
回复

“未定义行为(undefined behavior)”跟“未指定行为(unspecified behavior)”之间的重大区别。前者是对于不正确的,有毛病的程序而言,未定义行为可能是任何行为,轻则出现意料之外的结果,重则程序崩溃(崩溃还算好的,糟的就是错了还一声不吭^_^)。后者则是对于well-formed程序而言,未指定(unspecified)行为的可能性一般是有限的(例如函数参数的求值顺序就是函数参数个数的全排列种),只不过具体的实现不用在文档里说明究竟在它的实现上的特定行为是怎样的。』 顺便提一下“由实现定义的行为(implementation defined)”,这一行为跟“unspecified behavior”比较类似,都是针对well-formed程序而言,只不过后者的具体行为需要特定实现注明在文档中,让用户知道。 我们一直以为i=(i++)的行为是unspecified,即以为它至少还是well-formed程序,只不过在不同编译器上有不同结果罢了,然后结果却大谬不然,其行为是undefined,可能产生任何结果(从概念上来说,甚至可能导致程序崩溃^_^)。


i = (i++)这种表达式如果i是用户自定义迭代器的话,其行为却又变成了 unspecified,甚至由于这里左端表达式并没有实际的side-effect,所以其结果甚至是 定 的!这就是说,在build-in operation跟user-defined operator之间某些情况下存在着不易察觉的隐晦差别。
星羽 2007-09-27
  • 打赏
  • 举报
回复
jiangsheng(蒋晟.Net[MVP])

传说中的钻石黄老5
ivy1023 2007-09-27
  • 打赏
  • 举报
回复
个人感觉回掉函数,就是这样的。
回调函数决定调用时机与怎么调用,而客户程序负责具体实现。

好多驱动程序以及库函数就是这样实现的。
ckt 2007-09-27
  • 打赏
  • 举报
回复
第一次这里见到MVP
蒋晟 2007-09-27
  • 打赏
  • 举报
回复
http://community.csdn.net/IndexPage/SmartQuestion.aspx#bespecific
世界上大部分的东西都不在C++的定义之内
lockhall 2007-09-27
  • 打赏
  • 举报
回复
搬个板凳,等人总结。
ckt 2007-09-27
  • 打赏
  • 举报
回复
往指针里写数据
1,项目功能:开发一个在线学习平台,一共3个身份:管理员,老师和学生!   ①管理员功能:登录后可以添加学生信息,管理所有学生信息,添加单个老师信息,也可以批量导入很多老师信息,管理所有老师信息,添加和管理学院信息,发布课程信息,管理所有课程,查看回复话题讨论信息,发布网站公告,管理网站公告信息!    ②教师功能:上传课程视频信息,查询管理所有教学视频,上课课程文档课件信息,查询管理所有课件文档,新增讨论话题信息,查询编辑管理所有话题信息,按照课程发布作业信息,可以向某次作业中加入题目信息,也可以删除题目信息,每个题目带有数值,老师可以修改个人信息。    ③学生功能:查询所有课程信息,在线课程视频信息查询,可以在线观看某个视频教学,查询和下载所有的课件文件,查看所有话题讨论信息,可以回复话题,也可以查看话题的回复信息,可以查询网站公告信息,查询老师布置的作业,进入作业题目列表做题,提交可以查看完成作业的数,可以修改个人信息。2,涉及技术:SSM框架(Spring,SpringMVC,MyBatis),MySQL数据库,Maven,Tomcat3,开发环境:IDEA4,讲解方式:从环境安装,项目搭建,以及项目介绍等进行讲解5,包含资料:项目源码(含数据库文件),环境安装包,项目文档。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧