宏定義要注意的問題

1,考慮以下代碼:

include <stdio.h>

define max(a,b) a>b?a:b

int main(int argc, const char * argv[]) {
int a=3,b=2;
int c;
c=max(a++, b);
printf("%d",c);
return 0;
}
c=max(a++,b)等價(jià)與c=a++>b?a++:b而并不是先將a的值加一再將加一后的值和b進(jìn)行比較。
c的輸出結(jié)果是什么呢?
答案是4!
查看匯編代碼,過程一目了然!
2,匯編代碼如下:
//棧中14號位置記為a,棧中18號位置記為b
0x100000f26 <+22>: movl $0x3, -0x14(%rbp)//a=3
0x100000f2d <+29>: movl $0x2, -0x18(%rbp)//b=2
//將棧中14號位置的數(shù)(3)賦給寄存器edi;
0x100000f34 <+36>: movl -0x14(%rbp), %edi//edi=3
//將寄存器edi的值符給eax;
0x100000f37 <+39>: movl %edi, %eax//eax=3
//eax的值加一后再賦給eax,現(xiàn)在eax里的數(shù)為4
0x100000f39 <+41>: addl $0x1, %eax//eax=3+1
//將eax里的數(shù)賦給棧里的14號位置,即原來的3變?yōu)榱?
0x100000f3c <+44>: movl %eax, -0x14(%rbp)//a=4
//比較棧中18號位置存放的數(shù)(2)和edi存放的數(shù)(2)
//注意:不是18號位置和14號位置進(jìn)行比較?。?!
0x100000f3f <+47>: cmpl -0x18(%rbp), %edi
//條件轉(zhuǎn)移指令
0x100000f42 <+50>: jle 0x100000f5b ; <+75> at main.c:15
//將棧中14號位置的數(shù)(4)給EAX
0x100000f48 <+56>: movl -0x14(%rbp), %eax//eax=4
0x100000f4b <+59>: movl %eax, %ecx//ecx=4
0x100000f4d <+61>: addl $0x1, %ecx//ecx=4+1
0x100000f50 <+64>: movl %ecx, -0x14(%rbp)//a=5
0x100000f53 <+67>: movl %eax, -0x20(%rbp)//c=eax=4
c=a++>b?a++:b的流程圖如下:箭頭上的序號代表代碼執(zhí)行順序


2.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Return-Oriented-Programming(ROP FTW) Author: Saif El-Sher...
    RealSys閱讀 3,516評論 0 2
  • 本文首發(fā)于我的博客 Bomb Lab 實(shí)驗(yàn)代碼見GitHub 簡介 BombLab是CS:APP中對應(yīng)第三章內(nèi)容:...
    viseator閱讀 14,478評論 0 14
  • 如果我病了,我就不用考試了 太陽落山之后,皮卡車在曠野里行駛,給人一種絕望的感覺。 讀研的時(shí)候我曾經(jīng)想先工作兩年,...
    路建華閱讀 150評論 1 0
  • 今天晚上為什么畫了這么多不同的羽毛呢?因?yàn)樽蛲砟莻€(gè)美麗絢爛的夢境: 陪小伙伴去某公司參加二面(表問我為啥面試還要陪...
    曉冰小時(shí)光閱讀 691評論 13 5
  • 文/靈懂 昨天拿起了朋友的ipad玩,剛好他的平板電腦里存了一款叫極品飛車的游戲。我很早就在我的手機(jī)里玩了這款游戲...
    頌亦閱讀 635評論 0 1

友情鏈接更多精彩內(nèi)容