문제

다음과 같이 바이트 배열에서 읽고 있습니다.

int* i = (int*)p;
id = *i;
i++;

내가 틀렸다면 나를 바로 잡으십시오. 그러나 ++는 *보다 우선합니다. 그래서 같은 진술에서 *i와 i ++를 결합 할 수 있습니까? (예 : *i ++)

(이것은 C ++가 아닌 기술적으로 안전하지 않은 C#입니다. P는 바이트*)

도움이 되었습니까?

해결책

나는 그것을 믿는다

id = *i;
i++;

그리고

id = *i++;

동등합니다.

그만큼 ++ 접미사로 사용될 때 연산자 (예 : i++), 증분 전에 변수의 값을 반환합니다.


나는 반사기 출력에 대해 다소 혼란스러워합니다

unsafe class Test
{
    static public void Test1(int p, out int id)
    {
        int* i = (int*)(p);
        id = *i;
        i++;
    }

    static public void Test2(int p, out int id)
    {
        int* i = (int*)(p);
        id = *i++;
    }
}

그것은 나온다

public static unsafe void Test1(int p, out int id)
{
    int* i = (int*) p;
    id = i[0];
    i++;
}

그리고

public static unsafe void Test2(int p, out int id)
{
    int* i = (int*) p;
    i++;
    id = i[0];
}

분명히 동일하지 않습니다.

다른 팁

id = *i++

당신이 원하는 것을 할 것입니다.

++는 불균형 후 포인터를 수정합니다.

편집 : Eric이 지적했듯이 사양에 따라 ++는 DeReeference 이후에는 발생하지 않습니다. I ++는 I ++를 증가시키고 초기 값을 반환하므로 사양 정의 된 동작은 DeReeference 이전에 발생합니다. ID = *i ++의 가시 동작은 피로 전후에 발생하는 증분을 보더라도 동일합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top