社区
C语言
帖子详情
100分 讨论
zzyjsjcom
2007-09-27 08:07:51
大家说说 c语言的未定义行为??
...全文
196
12
打赏
收藏
100分 讨论
大家说说 c语言的未定义行为??
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
往指针里写数据
给出一个百
分
制成绩,要求输出成绩等级A,B,C,D,E。90
分
以上为A,80~89
分
为B,70~79
分
为C,60~69
分
为D,60
分
以下为E
1、给出一个百
分
制成绩,要求输出成绩等级A,B,C,D,E。90
分
以上为A,80~89
分
为B,70~79
分
为C,60~69
分
为D,60
分
以下为E.要求: (1)
分
别用if语句和switch语句实现; (2) 当输入非法数据(如负数)时,应给出“输入数据错误“信息 switch语句实现: #include intmain() { intscor
5个海盗,
分
100
个金币
五位绝顶聪明、勇敢、理智、果断干练的女海盗抢得
100
枚金币后,
讨论
如何进行公正
分
配。他们商定的
分
配原则是: (1)抽签确定各人的
分
配顺序号码(1,2,3,4,5); (2)由抽到1号签的女海盗提出
分
配方案,然后5人进行表决,如果方案得到超过半数的人同意,就按照他的方案进行
分
配,否则就将1号扔进大海喂鲨鱼 (3)如果1号被扔进大海,则由2号提出
分
配方案,然后由剩余的4人进行表决,当
SCI论文
讨论
部
分
作用有多重要?应该怎么写作?审稿人有什么意见?
集四家之言,侵删。( ̄▽ ̄)~* 不写
讨论
部
分
的坏处 看看知识付费大v是怎么说的:1 论文深度不够,没有层次感,让审稿人阅读起来平淡无奇,激发不了兴趣; 不能透过已有的研究结果看到背后的本质问题,支撑不了研究的创新点和体现不出研究的重要性; 丧失通过深入
讨论
具体问题而丰富论文的其它部
分
(比如引言和试验/假设方法)的机会; 丧失通过深入
讨论
具体问题而产生更多科研想法的机会(有可能是下一篇论文的想法); 导致论文往往不能发表在高水平期刊上,因为
讨论
往往能让论文更加明确创新点,突出研究结果的重要性等,因此,高
1051: 习题4-8-1 百
分
制成绩转换为等级
1051: 习题4-8-1 百
分
制成绩转换为等级 时间限制: 1 Sec内存限制: 12 MB 提交: 303解决: 256您该题的状态:已完成 [提交][状态][
讨论
版] 题目描述 从键盘输入一百
分
制成绩,要求输出其所对应的等级'A', 'B', 'C', 'D'。85
分
以上(含)为'A',70~84
分
之间为'B',60~69
分
之间为'C',60
分
以下为'D'。 请用if语句实...
C++实验——参赛歌手计算平均
分
问题:去掉一个最高
分
,去掉一个最低
分
,将剩下
分
数的平均值作为选手的最后成绩。这里假设共有10位评委,都是按照百
分
制打
分
。
话不多说,先上我写的代码然后
讨论
://歌唱大赛选手成绩计算 //去掉一个最高
分
,去掉一个最低
分
,将剩下
分
数的平均值作为选手的最后成绩。这里假设共有10位评委,都是按照百
分
制打
分
。 #include <iostream> #include <string> const int Arsize = 10; int main() { using namespace std; ...
C语言
70,020
社区成员
243,264
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章