section .date
data_items:
.long 23,35,67,89,212,45,233,63,45
.section .text
.globl _start
_start:
movl $data_items, %eax
pushl %eax
call max
addl $4, %esp
movl %eax, %ebx
movl $1, %eax
int $0x80
.type max, @function
max:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $0, %ecx
movl 8(%ebp), %ebx
movl 8(%ebp), %edx
movl (%ebx), %eax
addl $36, %edx
movl %edx, -4(%ebp)
loop_start:
movl -4(%ebp), %edx
cmpl %ebx, %edx
je loop_end
addl $4, %ebx
movl (%ebx), %edx
cmpl %eax, %edx
jle loop_start
movl %edx, %eax
jmp loop_start
loop_end:
movl %ebp, %esp
popl %ebp
ret
输出= #include<stdio.h>
int main()
{
int *p;
int arr[]={10,20};
p=arr;
++*p; //expected evaluation = (++(*p))
printf("arr[0]=%d, arr[1]= %d, p=%d\n",arr[0],arr[1],*p);
}
这完全没问题。但是,这里
arr[0]=11, arr[1]= 20, p=11
由于后缀#include<stdio.h>
int main()
{
int *p;
int arr[]={10,20};
p=arr;
++*p++; //expected evaluation = (++(*(p++))) = *p->20 , thus ++20 = 21
printf("arr[0]=%d, arr[1]= %d, p=%d\n",arr[0],arr[1],*p);
}
的优先级较高,++
或a[1]
的值应为21但是:
*p
由于某种原因,它不会增加?为什么呢?
答案 0 :(得分:3)
遵循operator precedence和评估顺序,语句++*p++
将首先对指针p
进行后缀修正,因为修复后增量运算符的优先级高于取消引用。
p++
的结果将返回p
的旧值并增加p
,以使其指向20
。取消引用后缀增量的结果(这是一个指向arr[0]
的指针)会给你10
这个预修复递增,从而产生11。
最终结果是一个包含值{11,20}
的数组,输出确认。
答案 1 :(得分:0)
++*p++;
相当于:
int* p1 = p++; // p1 points to a[0]. p points to a[1]
++(*p1); // Increments a[0]
这解释了输出。