>
#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] 의 가치가 높을수록  또는 *p  21이어야하지만 다음과 같습니다 :

arr[0]=11, arr[1]= 20, p=20

어떤 이유로 증가하지 않습니까? 왜요?


  • 답변 # 1

    연산자 우선 순위와 평가 순서에 따라, 진술 ++*p++  먼저 포인터 p 후 수정 증가 수정 후 증가 연산자는 우선 순위보다 우선 순위가 높기 때문에.

    p++ 의 결과   p 의 이전 값을 반환합니다   p 를 증가   20 를 가리 키도록 . 접미사 증분의 결과 참조 ( arr[0] 에 대한 포인터 임) )는 당신에게 10 를 제공합니다  이것은 프리픽스가 증가하여 11을 산출합니다.

    최종 결과는 값 {11,20} 를 포함하는 배열입니다 , 출력이 확인되면

  • 답변 # 2

    ++*p++;
    
    

    와 동일합니다 :

    int* p1 = p++; // p1  points to a[0]. p points to a[1]
    ++(*p1);       // Increments a[0]
    
    

    출력을 설명합니다.

관련 자료

  • 이전 azure devops - MSBuild 게시 실행시 SSDT 게시 중지
  • 다음 linux - 테서 랙트 의존성 버전 변경