你真的理解了 i++么

`

include <stdio.h>

void main(void)
{
int j = 0;
for (int i = 0; i < 10; i++) {
j = (j++);
}
printf("j == %d\r\n", j);
}
`
这段代码最后输出的j的值是多少?

最开始我以为结果是10,实践出真知,没想到结果是0。

探寻真相:
基于64位PC验证,这条命令生成汇编代码。
`
**gcc test_i++.c -S -O0 **

       .file   "test_i++.c"
       .section        .rodata

.LC0:
.string "j == %d\r\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, -8(%rbp)
movl $0, -4(%rbp)
jmp .L2
** .L3:**
** movl -8(%rbp), %eax**
** leal 1(%rax), %edx**
** movl %edx, -8(%rbp)**
** movl %eax, -8(%rbp)**
** addl $1, -4(%rbp)**
.L2:
cmpl $9, -4(%rbp)
jle .L3
movl -8(%rbp), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
nop
leave
.cfi_def_cfa 7, 8

.L3 汇编代码:
// 将变量j的值保存到%eax寄存器
movl -8(%rbp), %eax
// 将加1的值保存到%edx寄存器
leal 1(%rax), %edx
// 将%edx的值写入到j变量,此时是加1后的
movl %edx, -8(%rbp)
// 将%eax的值写入到j变量,可是%eax保存的是j的初始值即0
movl %eax, -8(%rbp)
// for循环中的++
addl $1, -4(%rbp)
`
基于32位MCU验证:
``

posted @ 2024-07-03 11:41  蜗牛等等  阅读(18)  评论(0)    收藏  举报