【c语言LT c语言a=a+1】看了前面的很多回答,都没有回答到点子上,这个问题其实是典型的关于C语言中的序列点和副作用产生的问题 。
大部分的语句是不带副作用的,而问题中的语句是一个的带副作用的语句,就是在取a的值进行赋值的同时,又修改a的值对其进行自增1,其自增1就是语句中的副作用 。
序列点是C标准中给出的概念,简单的理解就是程序执行的点,在这个点之前的语句的执行结果都将生效 , 而这个点之后的语句还未开始执行,常见的序列点有语句末尾的;号、逻辑运算符、逗号运算符、条件表达式 。
C语言标准规定:两个序列点之间的执行顺序是任意的 。当然这个任意是在不违背操作符优先级和结合特性的前提下的 。这个规定的意义是为编译器的优化留下空间 。
问题中的表达式 a=a++ 处于两个序列点之间的,编译器可以先算完a++,完成a自增再写结果给a , 也可以先将a=a,再令a自增 。无论哪种执行对于C语言标准来说都是符合标准的,具体还是要看编译器选择哪一种实现 。
在实际开发中我会建议不要在一个序列点之间对一个变量多次进行赋值写入操作,因为这些操作的结果都属于未定义的行为 , 都是要看编译器具体实现的,使程序不具备可移植性,而变成了依赖于某个编译器的实现 。
而这个问题可以称他为未定义的实现,就是C语言标准没有给出标准结果 , 交由编译器负责具体实现,而无论如何实现其实对于C语言标准来说都是对的 。
这是一个未定义行为,各家编译器可能结果不一样,不要写出这样的代码 。
- 老公居家不干活怎么办 老公不爱我,我该怎么办
- 婚姻情感咨询主要咨询些什么 婚姻咨询免费
- 菊麟创造101第几名 创造101王菊最终排名
- 诗圣指的是哪位诗人?
- 月经期间宜吃什么食物 经期适宜吃什么食物
- 没腌制过的牛排怎么做
- 微胖女孩性感穿搭 胖女孩性感穿搭
- 李宇春是中性人吗? 长相中性的女明星
- 男性结扎手术全过程 男人做结扎手术好吗
- 如何用拖把拖地不留水印?