int main() {
int i =3;
printf("%d %d\n", ++i,++i);
//printf("%d %d\n", i++,i++);
return 0;
}
请问为什么输出5,5啊,是所有的前置加加完成后,再输出?如果删除第一个printf注释行部分输出4,3 这怎么理解
#include <stdio.h>
int main() {
int i =3;
printf("%d %d\n", ++i,++i);
printf("%d %d\n", i++,i++);
return 0;
}
对应的汇编代码是:
.file "a.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "%d %d\12\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB6:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
call ___main
movl $3, 28(%esp) # 28(%esp) 保存了变量 i
incl 28(%esp) # 第一个++i
incl 28(%esp) # 第二个++i
movl 28(%esp), %eax # 传第2个参数
movl %eax, 8(%esp)
movl 28(%esp), %eax # 传第1个参数(i=5)
movl %eax, 4(%esp)
movl $LC0, (%esp) # 传第0个参数(i=5)
call _printf # 调用printf函数
# ------第1个printf调用到此结束, 下面开始是第二个printf调用
movl 28(%esp), %edx # 保存原来的i, 保证后面首先用到的是没有+1的值
incl 28(%esp) # i++
movl 28(%esp), %eax # 保存原来的i, 保证后面首先用到的是没有+1的值
incl 28(%esp) # i++
movl %edx, 8(%esp) # 传第2个参数(i=5)
movl %eax, 4(%esp) # 传第1个参数(i=6)
movl $LC0, (%esp) # 传第0个参数("%d %d\n")
call _printf # 调用printf函数
# ----------第2个printf调用到此结束
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE6:
.def _printf; .scl 2; .type 32; .endef
根据参数传递顺序, 传第2个参数的时候, 先28(%esp), %edx保存原来的值, 作为后面传入的第2个参数, 这一步其实就已经算使用了i, 所以马上又执行i++, 也就是incl 28(%esp)
同样的, 接下来传第1个参数, 也是先保存i原来的值(这个时候i已经等于6了), 然后再i++
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。