2017-05-09 11 views
0

우리가주문 (*와 표현에 대한 ++)

int i = 5; /*line 1*/ 
int *p = &i; /*line 2*/ 
*p++; /*line 3*/ 

라인 3에 대한 평가 순서는 무엇인가가 있다면? 는 (나는이 페이지 후 뭔가 이상한 가리 수 있음을 알고있다 -하지만 모두 같은 주소의 올바른 메모리 만 평가 순서에 관심이 아니에요 * 및 ++ 같은 우선 순위를 갖고있는 것 같아요)

+0

아니요 우선 순위가 같지 않습니다. Postfix 양식 ++는 접두사 양식과 달리 *보다 우선 순위가 높습니다. – StoryTeller

+0

'++'가 포인터를 증가시키는 것을 기억하는 간단한 방법은 보통 단 일행 strcpy 구현을 주목하는 것입니다 :'while (* dst ++ = * srC++);'++는 포인터 대신 실제 문자를 증가 시키면 실패합니다 . – Groo

+3

운영자 우선 순위는 [검색 가능 항목]입니다 (http://en.cppreference.com/w/c/language/operator_precedence). –

답변

4

아니, postfix increment has higher precedence .

귀하의 경우 증분 값의 부작용은 값 평가 참고 (역 참조 연산자 포함) 이후에 발생합니다. 하지만 가치 평가의 결과는 폐기됩니다 (결과를 저장하기 위해 노력하지 않았습니다).

C11을 인용 제 §6.5.2.4 (강조 광산)

:

그래서, 마지막 결과는 등가


p++; 같은 주 것

접미사 결과 ++ 연산자는 피연산자의 값입니다. 부작용으로서 피연산자 개체의 값이 증가합니다 (즉, 적절한 유형의 값 1은 이 추가됨). 제약 조건, 유형 및 변환에 대한 정보와 포인터에 대한 연산의 영향에 대한 추가 연산자 및 복합 할당에 대한 설명을 참조하십시오. 결과의 값 계산은 의 부작용 전에 피연산자의 저장된 값을 업데이트합니다. [...]

당신은이 작업을 위해 * P는 주위에 괄호를 넣어야 할
+0

따라서 ++가 (더 높은 우선 순위를 가짐으로써) 먼저 평가되어야한다고해도 * p가 평가 될 때까지 연기됩니까? – Alex

+0

@Alex 예, "증분"은 부작용이고, 접미사'++ '의 값은 피연산자 자체의 값으로, 이미 내 답변에서 강조 표시되어 있습니다. –

+0

@Alex - 사실 - 평가 순서와 우선 순위는 근본적으로 무관합니다. http://stackoverflow.com/a/5475260/129570을 참조하십시오. –

-2

:

int i = 5; /*line 1*/ 
int *p = &i; /*line 2*/ 
(*p)++; /*line 3*/ 
printf("Hello, World! %d\n", *p); 

참조 : http://en.cppreference.com/w/c/language/operator_precedence

+3

* * * 작동하려면? OP는 자신이 원하는 것이 무엇인지 밝히지 않았고,이 세 줄의 평가 방법에 대해서만 묻습니다. – StoryTeller

+0

네가 맞아. 실제로 OP는 컴파일러가 운영자 우선 순위에 대해 몇 가지 변형을 수행하고 기대와 일치하는지 확인해야합니다. 오, 그럼 - SO가 포인트를 얻는 쉬운 게임이 아닙니다! :-) – EricWerk

0

*p++*(p++)로 처리됩니다 때문에 후위 ++의 우선 순위 이고 *보다 높습니다.

+0

이것에 대해 확실합니까? –

+0

@SouravGhosh 예. – rsp

+1

@SouravGhosh - 의미 론적으로 올바른 평가입니다. 컴파일러는 증가하기 전에로드를 시퀀싱하지만, ** rsp **와 같이 표준'* p ++ '에 정의 된 C 추상화는'* (p ++)'와 의미 상 동일합니다. – StoryTeller