你真的理解了 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验证:
``

浙公网安备 33010602011771号