KEIL编译出错?关于y=y++;

2020-02-04 09:28发布

850:           selkey1f=selkey1f++;
   851:     
C:0x03D3    AF12     MOV      R7,selkey1f(0x12)
C:0x03D5    0512     INC      selkey1f(0x12)
C:0x03D7    8F12     MOV      selkey1f(0x12),R7

在自己的机子上编译的,结果selkey1f不变化;用的kel4,而在同事的机子上keil2及keil4均编译为 INC selkey1f(0x12)。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
30条回答
takashiki
2020-02-05 22:28
selkey1f=selkey1f++;  

这句是有问题的,这里selkey1f被访问(改变)了三次:读,赋值,自增
C语言可不保证这个结果的正确性,因为它违反了关于C语言副作用的描述,至少违反了MISRA C中的三条:
规则 12.1(建议): 不要过分依赖C表达式中的运算符优先规则
规则 12.2(强制): 表达式的值在标准所允许的任何运算次序下都应该是相同的。
规则 12.13(建议): 在一个表达式中,自增(++)和自减(- -)运算符不应同其他运算符混合在一起。

selkey1f=selkey1f++; 的一般行为如下:
C/C++:结果会自增。由于C语言的歧义性极强,结果是不被保证的。
C#/Java:结果不变

另外,你可以说MISRA C变态,找自虐,但是,MISRA C对消除歧义提高程序的鲁棒性确实非常有用。

一周热门 更多>