首页 > 代码库 > 后置++和解引用*的优先级
后置++和解引用*的优先级
char* p = "worldcup"; *p++ = ‘a‘;
其中,*p++ = ‘a‘执行顺序,涉及到后置++和解引用*的优先级问题:
;19: char* p = "worldcup"; mov dword ptr [ebp-0Ch],offset string "worldcup" ;20: *p++ = ‘a‘; mov eax,dword ptr [ebp-0Ch] ; p -> eax mov byte ptr [eax],61h ; ‘a‘ -> *eax 即 ‘a‘ -> *p mov ecx,dword ptr [ebp-0Ch] ; p -> ecx add ecx,1 ; ecx += 1; mov dword ptr [ebp-0Ch],ecx ; ecx -> p
可见是先执行*p = ‘a‘,再执行p += 1,似乎说明解引用*的优先级大于后置++。
可是如果你去查看运算符优先级表就会发现,后置++的优先级是高于解引用*的。
也就是说*p++实际上是*(p++),这是怎么回事呢?
如果两个运算符被用于同一个操作数,则首先结合优先级最高的运算符。这意味着后置++将对p进行操作,而不是对*p进行操作。
而后缀++的特性,不就是先使用当前值吗?所以加1的操作只能放到后面了。
单独的*p++是看不出什么名堂的:
;20: *p++; mov eax,dword ptr [ebp-0Ch] add eax,1 mov dword ptr [ebp-0Ch],eax
然而一旦对p有其他操作,后缀++先使用值的特性立马显现。
这就出现了汇编代码中解引用*优先级大于后置++的假象。
后置++和解引用*的优先级
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。