C语言中的"序列点"和“未定义”

      在上一篇文章<由只北一样的表达式说开去>中提到了"序列点"和“未定义”这两个概念,而且好像有点难理解的样子,在这篇文章就理一下相关概念。

     首先是"序列点 ":序列点是一个时间点,此刻操作完成,所有的副作用已确保结束。C语言标准中提及的序列点包括:1、完整表达式(表达式语句或不为任何其他表达式的子表达式的表达式)的尾部;2、||、&&、?:或逗号操作符处;3、函数调用时(参数求值完毕,函数被实际函数调用前)。ANSI C标准有这样的描述:在上一个序列点和下一个序列点之间,一个对象所保存的值至多只能被表达式的求值修改一次,而且只有在确定将要保存的值的时候才能访问前一个值。这句话的前半句就排除了诸如:i++*i++和i = i++这样的 表达式,在两个序列点之间,两个表达式中的i的值都被修改了两次。后半句要表达的意思是:如果对某个对象需要写入一个完整表达式中,则在同一个表达式中对该对象的访问应该局限于用来计算将要写入的值,这就有效的限制了只有能在确保修改之前才访问变量的表达式为合法的表达式 ,禁止了像:a[i ] = i++这样的表达式。因为在这个表达式中,对i的访问和最终对i值的写入木优一点关系,也就是说,在这次访问中,并没有神马好的方法来确定对i的访问是在i值写入之前还是之后。所以在ANSI C 标准 中将这种表达归为“未定义”的。好吧,那神马叫做 “未定义”?

     C语言中有3种情况来表示没有明确要求某个特定构造或者使用它的程序必须要完成的事情的领域。具体是:实现定义的、未定义的、不确定的

    实现定义的:实现必须选择某种行为,对程序不能编译失败,这种选择必须要 文档说明。不确定的:跟未定义相似,但无需有文档说明。未定义的:任何事情都有可能发生,标准对此没有任何要求,程序可能编译失败,可能发生运行时错误、也有可能如你所期望的那样运行,这样的代码是比较危险的。因为,你不能保证它在你希望它不出错的时候不出错。 so,应该尽量不让这种代码出现在你的程序里。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值