前面几篇文章一直在说关于未定义表达式求值顺序的问题,是时候做一点总结了,很多教材都建议在程序中尽量少用未定义的表达式,因为确定序列点确实是一件让人不爽的事,这里有
一些建议,或许能减少未定义表达式的出现频率。
1、确保一个表达式最多只修改一个对象:一个简单变量,一个数组成员、一个指针指向的位置。“修改”指的是诸如:=、+=、-=等赋值操作和++、--运算。
2、如果一个对象在一个表达式中出现一次以上而且在表达式中要被修改,则要确保对该对象的所有的读访问都被用于计算它的最终值,该条规则允许i=i+1合法且有实在定义。
3、如果想破坏第一条规则,则要确保修改的对象互不相同。
4、如果在两次修改或修改和访问之间置入定义的序列点操作符,则可以破坏第一条和第二条规则。例如:while( c = getchar()!=EOF && c!='\n'){...}
,这条表达式是合法的,因为虽然表达式两次访问
了同一个变量的值,但是第二次对c
的访问是出现在&&引入的序列点之后。所以
不会受c值
可能被
修改影响。
分享到:
相关推荐
C语言头文件包含的函数,让c更深入,更上一层楼。
试谈C语言的未定义行为.pdf
主要介绍了vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
C语言中自增自减表达式的未定义行为.pdf
介绍c语言中条件编译相关的预编译指令
COMSOL等离子体教程pdf
sys未定义的解决方法sys未定义的解决方法
C语言中局部变量和全局变量 变量的存储类别 static extern auto register 使用
基于COMSOL Multiphysics的等离子体气动激励系统仿真
我看了很多,只有这个一针见血,读后感就觉很清晰,不会更加迷惑
绝对可靠,因为本人下载的东西太多了,但是没有一个可靠的。经过本人两三天的修改程序及仿真图,结果弄正确了。
3.12 我不想学习那些复杂的规则,怎样才能避免这些未定义的求值顺序问题呢? 其他的表达式问题 *3.13 ++i和i++有什么区别? 3.14 如果我不使用表达式的值,那我应该用i++还是++i来做自增呢? 3.15 我要检查...
C语言中,变量分为全局变量和局部变量;也可以这样分:自动变量,静态变量.前者是按变量作用范围来分的,而后者是按变量存储方式来分的. 如果按存储占用空间来分,可以是整型变量,字符型变量,浮点型变量等.当然还有...
3.12 我不想学习那些复杂的规则,怎样才能避免这些未定义的求值顺序问题呢? 38 其他的表达式问题 39 *3.13 ++i和i++有什么区别? 39 3.14 如果我不使用表达式的值,那我应该用i++还是++i来做自增呢? 39 ...
MATLAB中isequal函数转化为C语言,有项目算法使用matlab中isequal函数进行运算,这里需要将转化为C语言 有项目算法使用matlab中isequal函数进行运算,这里需要将转化为C语言,从而模拟算法运行,将算法移植到qt。 ...
下面小编就为大家带来一篇完美解决IE9浏览器出现的对象未定义问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,祝大家游戏愉快哦
3.12 我不想学习那些复杂的规则,怎样才能避免这些未定义的求值顺序问题呢? 其他的表达式问题 3.13 ++i和i++有什么区别? 3.14 如果我不使用表达式的值,那我应该用i++还是++i来做自增呢? 3.15 我要检查一个数...
解决IE中JSON未定义的兼容问题