Program Tip

"int * p = + s;"는 무엇입니까?

programtip 2020. 11. 24. 19:28
반응형

"int * p = + s;"는 무엇입니까? 하다?


나는 여기서 이상한 유형의 프로그램을 보았다 .

int main()
{
    int s[]={3,6,9,12,18};
    int* p=+s;
}

위의 프로그램은 GCCClang 컴파일러 에서 테스트 되었으며 두 컴파일러 모두에서 정상적으로 작동합니다.

궁금합니다. 무엇을 int* p=+s;합니까?

배열 s이 포인터 유형으로 붕괴됩니까?


내장 operator+은 포인터 유형을 피연산자로 사용할 수 있으므로 배열 s전달하면 배열 에서 포인터로 변환 된 다음 포인터 int*가 반환됩니다. +s, 포인터를 얻기 위해 개별적으로 사용할 수 있습니다 . (이 경우에는 불필요합니다. 그렇지 않으면 operator+포인터로 감쇠 한 다음에 할당됩니다 p.)

(강조 광산)

내장 단항 더하기 연산자는 피연산자의 값을 반환합니다. 이것이 no-op가 아닌 유일한 상황은 피연산자가 정수 유형 또는 범위가 지정되지 않은 열거 유형을 갖는 경우이며, 이는 정수 승격에 의해 변경됩니다. 예를 들어 char를 int로 변환하거나 피연산자가 lvalue-to-rvalue의 적용을받는 경우, 배열-포인터 또는 함수-포인터 변환.


이것을 테스트하십시오 :

#include <stdio.h>
int main(){
    char s[] = { 'h', 'e', 'l', 'l', 'o' , ' ', 'w', 'o', 'r', 'l', 'd', '!'} ;
    printf("sizeof(s) : %zu,  sizeof(+s) : %zu\n", sizeof(s), sizeof(+s) ) ;
}

내 PC (Ubuntu x86-64)에서 다음과 같이 인쇄됩니다.

sizeof(s): 12,  sizeof(+s) : 8

어디

12 = number of elements s times size of char, or size of whole array
 8 = size of pointer

이것은 여기서 실질적인 효과가없는 단항 더하기 기호입니다. 예를 들면 :

#include <iostream>

int main() {
    int a[] = {1};

    std::cout << a << " " << +a << std::endl;
}

이것은 a모두에 대해 동일한 주소를 인쇄합니다 +a. 배열은 평소와 같이 포인터로 붕괴됩니다.

-a대신 단항 마이너스 인 경우 GCC는 오류를 표시합니다.

error: wrong type argument to unary minus

편집 :이 영업 이익의 코드에 영향을주지 않습니다, 비록 a+a정확하게 동일하지 않습니다. 자세한 내용은 Khurshid Normuradov 및 songyuanyao의 답변을 참조하십시오.


배열 s이 포인터 유형으로 붕괴됩니까?

예.

무엇을 int* p=+s;합니까?

단항 +연산자는 배열이 포인터로 감쇠되도록합니다.

C ++ 표준, 5.3.1 단항 연산자 (P7) :

단항 + 연산자의 피연산자는 산술, 범위가 지정되지 않은 열거 또는 포인터 유형을 가져야 하며 결과는 인수의 값입니다. 적분 승격은 적분 또는 열거 피연산자에서 수행됩니다. 결과 유형은 승격 된 피연산자의 유형입니다.

단항 +형식 (+s)은 피연산자가 숫자 또는 포인터로 평가되도록합니다.

자세한 내용은이 스택 오버플로 답변을 참조하십시오 .


여기서 단항 + 는 정수 배열의 주소를 가리 키도록 * p를 만듭니다. 두 개의 배열 s1과 s2를 봅시다

int s1[]={1,5,2};
int s2[]={2,5,2};

int *p=+s1;
p=+s2; 
printf("%d",(int)p[0]);

출력 : 2

그래서 내 관점에서 단항 +는 포인터 p를 배열의 시작 주소를 가리 키도록 만드는 것입니다.

참고 URL : https://stackoverflow.com/questions/50598177/what-does-int-ps-do

반응형