*p++는 *p+=1과 왜 다른가요?
고려사항:
void foo1(char **p) { *p++; }
void foo2(char **p) { *p += 1; }
그리고.
char *s = "abcd";
char *a = s;
foo1(&a);
printf("%s", a); //abcd
하지만 만약 내가 사용한다면foo2()
다음 대신:
char *a = s;
foo2(&a);
printf("%s", a); //bcd
누가 설명 좀 해줄래?
열쇠는 의 precedence입니다.+=
및 그++
교환입니다.그++
precedence가 보다 높다.+=
(실제로 할당 연산자는 C에서 두 번째로 우선순위가 낮기 때문에)
*p++
포인터를 참조 해제한 후 포인터 자체를 1씩 증가시킵니다(보통 포인터 산술 규칙에 따르면 반드시 1바이트가 아니라 오히려).sizeof(*p)
주소)에 관한 정보입니다.반면에,
*p += 1
즉, 포인터가 가리키는 값을 1씩 증가시킵니다(포인터 자체에 대해서는 아무것도 하지 않습니다).
우선 순위포스트픽스++
prefix보다 긴 바인드*
그래서 증가한다.p
.그+=
는 플레인 할당 연산자와 함께 precedence 목록의 하위 끝에 있으므로 에1을 추가합니다.*p
.
프리픽스 ++와 *의 우선순위는 동일합니다.양쪽의 연관성은 오른쪽에서 왼쪽으로입니다.postfix ++ 의 precedence 는 * 와 프리픽스 ++ 의 양쪽 모두보다 높습니다.postfix ++의 연관성은 왼쪽에서 오른쪽으로 표시됩니다.
먼저 시작합시다.*p += 1
조금 다른 각도에서 대답하도록 하겠습니다.1단계에서는 연산자와 피연산자에 대해 설명합니다.이 경우에는 하나의 피연산자(포인터 p)이며, 여기서는 *(비참조)와 += 1(증분)의 두 연산자가 있습니다.순서 2(우선순위*가 높음)는 +=보다 높음
*P++
이건 좀 더 까다로워...maybe even wick 다시 한 번 피연산자(p 포인터)와 두 개의 연산자가 있습니다. 이제 참조 해제와 ++ 포스트 증가의 *만 동일한 우선 순위를 가집니다.(테이블에 따라서는 게시물의 ++가 더 높은 우선 순위입니다).
1단계에서는 연산자와 피연산자에 대해 설명합니다.이 경우 오퍼랜드이며, 2개의 연산자가 있습니다.이 경우 *는 비회의용이고 ++는 증분용입니다.순서 2 중 어느 쪽이 우선도가 높은가?++는 *보다 우선도가 높습니다.주의: 오른쪽에서 왼쪽으로 같은 우선순위를 가지고 있어도 ++는 * Step 3(어려운 부분)보다 앞에 있습니다.여기서 ++는 피연산자의 오른쪽에 있습니다.즉, POST의 인크리먼트를 의미합니다.이 경우 컴파일러는 다른 모든 인크리먼트를 완료한 후에 인크리먼트를 실행합니다.연산자...그 후가 무슨 의미죠?즉, 이 증분은 다음 ';'의 마지막 단계로서만 적용됩니다.따라서 이 증분은 같은 '회선'에 있는 다른 모든 연산자에 대해 실행됩니다.*+p일 경우 같은 회선상의 다른 연산자 앞에서 수행되므로 이 경우 프로세서의 레지스터 중 2개를 가져가는 것과 동등하며, 1개는 t를 유지합니다.참조되지 않은 *p의 값과 다른 값은 증가된 p++의 값을 유지합니다.이 경우 두 가지 이유는 POST 액티비티가 있기 때문입니다.여기서부터가 까다롭고 모순처럼 보입니다.POST는 다른 모든 오퍼랜드 다음에 적용된다는 것을 의미하고 다음 ';' 토큰 앞에만 적용된다는 것을 의미하며, 이 경우 ++가 *보다 우선합니다.
말씀드렸듯이, 까다로운 부분은 피연산자의 오른쪽에 있는 모든 증분은 적립되고 다음 라인으로 이동하기 전에 LAST 연산으로 적용된다는 것입니다.
언급URL : https://stackoverflow.com/questions/12221396/why-is-p-different-from-p-1
'programing' 카테고리의 다른 글
64비트 JVM 또는 32비트 JVM(프로그램 내에서)에서 실행 중인지 확인하려면 어떻게 해야 합니까? (0) | 2022.08.03 |
---|---|
Firebase + Vue + Quasar Framework에서 프로필 사진 변경 (0) | 2022.08.03 |
string.is Empty() 또는 ""equals(string)"를 사용해야 합니까? (0) | 2022.08.02 |
vuex 스토어 + 쿠키와 관련된 문제 (0) | 2022.08.02 |
Vue.js 서버에 대한 요구 체인 (0) | 2022.08.02 |