社区
C语言
帖子详情
100分 讨论
zzyjsjcom
2007-09-27 08:07:51
大家说说 c语言的未定义行为??
...全文
215
12
打赏
收藏
100分 讨论
大家说说 c语言的未定义行为??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
分
、2
分
和5
分
的硬币凑成1元,一共有多少种方法。
本文详细解析了一道经典算法题:如何用1
分
、2
分
、5
分
硬币组合成
100
分
的全部可能性。通过
分
情况
讨论
和递归代码实现两种方法,展示了数学思维与编程技巧的结合,适用于算法学习与面试准备。
分
糖果C++
博客围绕糖果
分
配问题展开,给出样例解释,
分
析了70
分
的暴力枚举思路和
100
分
基于取余运算性质的思路。当r - l + 1≥n时,答案为n - 1;当r - l + 1 < n时,需
分
类
讨论
。解题关键在于
分
类
讨论
,要遵循不重不漏原则。
csp的ISBN号码
100
分
运行0ms
博客文章
讨论
了一道看似简单的CSP题目——关于ISBN号码,指出其中易错的细节,导致部
分
参赛者无法获得满
分
。作者
分
享了解题思路,并提供了通过验证的代码,最终实现
100
分
且0ms的优秀成绩。
CSP-梯度求解 满
分
题解(从20
分
debug到
100
的心路历程)
本文围绕CSP-梯度求解题目展开,给出C++满
分
题解。先概述思路,包括设计数据结构、解析逆波兰式等,还提到‘-’符号需
分
类
讨论
。接着展示代码从20
分
逐步优化到
100
分
的过程,指出代码1.0因未做越界保护得
分
低,代码2.0修正减运算错误,代码3.0通过取模操作解决乘积项溢出问题。
day05 _列表练习
本文介绍了如何处理一组学生成绩,包括将负
分
修改为0、超过
100
分
的成绩设置为
100
分
,以及如何按降序排列并计算平均
分
。此外,还
讨论
了如何判断一个数列是否有序。
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章