++ * p ++不能处理数组中的第二个元素?

时间:2015-07-17 03:11:32

标签: c arrays pointers

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

由于某种原因,它不会增加?为什么呢?

2 个答案:

答案 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]

这解释了输出。