2、逗号表达式胡颂带括号时,最后的一个表达时的值会压栈(j++)
括号表达式在j++的外部,导致j++运算后j的值被雀纯压栈。
++j与此类似,但更没有疑问。
3、对应反汇编如下:
00401BE6 mov eax,dword ptr [ebp-4]
00401BE9 add eax,1
00401BEC mov dword ptr [ebp-4],eax
00401BEF mov ecx,dword ptr [ebp-4]
00401BF2 sub ecx,1
00401BF5 mov dword ptr [ebp-4],ecx
00401BF8 mov edx,dword ptr [ebp-8]
00401BFB add edx,1
00401BFE mov dword ptr [ebp-8],edx
00401C01 mov eax,dword ptr [ebp-8]
00401C04 pusheax
00401C05 mov ecx,dword ptr [ebp-8]
00401C08 mov dword ptr [ebp-30h],ecx
00401C0B mov edx,dword ptr [ebp-30h]
00401C0E pushedx
00401C0F pushoffset string "%d,%c\n" (00472068)
00401C14 mov eax,dword ptr [ebp-8]
00401C17 add eax,1
00401C1A mov dword ptr [ebp-8],eax
00401C1D callprintf (00408410)
00401C22 add esp,0Ch
可以看到:A、入栈的都是j,在调用printf之前进行了一次加一的动作。
B、printf之后又进行了一次加一的动作,最后j的实际值是67。
C、%d,%c两个占位符其实对应的是同一个寄存器中的值。
4、经常我们会对一些不常用的语法不知所措。这时候如果我们经常去问别人,可能不能马上获得满意的答案。此时,抱着“存在即是有理”的精神,我们看看这个编译器究竟是怎么做的(反汇编),就容易深入的理解问题了。
并且我们还要有个警示:不同的编译器的编译解释是不相同的。我们只需要知道它是这样裤岁郑做就可以了,但它究竟为什么要这样做,那就需要我们以后慢慢体会了。
1)void swap(char *p,char *q)的作用是两个地址的内容交换;2)字符'a'的ASCII值为65,那辩茄唤么 b 对应的就是 66;
3)纳漏a,b 交换后,就是 b,a;或携凯者表示为 66,65;或者 66,a
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)