开发者社区> 问答> 正文

printf函数输出自增变量

int main() {

    int i =3;
    printf("%d %d\n", ++i,++i);
    //printf("%d %d\n", i++,i++);
    return 0;
}

请问为什么输出5,5啊,是所有的前置加加完成后,再输出?如果删除第一个printf注释行部分输出4,3 这怎么理解

展开
收起
a123456678 2016-06-08 19:57:30 2193 0
1 条回答
写回答
取消 提交回答
  • 码农|Coder| Pythonista
    #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++

    2019-07-17 19:32:37
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载