有以下程序: main() { int i=10, j=65; printf("%d,%cn",(--i,j++),(i++,++j)); } 执行后输出结果是????

有以下程序: main() { int i=10, j=65; printf("%d,%cn",(--i,j++),(i++,++j)); } 执行后输出结果是????,第1张

1、结果为:66,B

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12257801.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存