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)。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
29条回答
chinaye1
1楼-- · 2020-02-05 11:26
回复【6楼】any_014  
回复【4楼】vivalite  
-----------------------------------------------------------------------
selkey1f++;
或selkey1f+=1;都没问题。
但写成selkey1f=selkey1f++;就不行。
-----------------------------------------------------------------------

selkey1f= ++selkey1f;行



写成selkey1f=selkey1f++;这样是表示

1、selkey1f=selkey1f;
2、selkey1f++;
babysnail
2楼-- · 2020-02-05 15:40
这是标准答案:

++i,--i   在前 是先加(减)后使用

i++,i--  在后则是先使用后加(减)
ddg_int
3楼-- · 2020-02-05 19:48
回复【7楼】chinaye1  程序猿
-----------------------------------------------------------------------

同意
takashiki
4楼-- · 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对消除歧义提高程序的鲁棒性确实非常有用。
any_014
5楼-- · 2020-02-05 22:53
 精彩回答 2  元偷偷看……
any_014
6楼-- · 2020-02-06 00:52
回复【10楼】takashiki  岚月影
-----------------------------------------------------------------------

受教了,谢谢。也谢谢楼上的各位。

一周热门 更多>