Operacje wskaźnika i pierwszeństwo operatora w C
Właśnie rozmawiałem dzisiaj z facetem z C i nie zgodziliśmy się na następujące kwestie:
int intgA[2] = { 1, 2 };
int intgB[2] = { 3, 5 };
int *intAPtr = intgA;
int *intBPtr = intgB;
Więc kiedy to robimy:
*intAPtr++ = *intBPtr++;
Moja analizaPierwszy:
intBPtr
zwiększa się o jeden, teraz wskazując na adres 5. Następnie, szacunek, trzymając wartość 5;
intAPtr
również zwiększa się o jeden, teraz wskazując na adres 2. Następnie odwoływanie i wartość wynosi 2;
W końcu:
2 zostaje zastąpione przez 5.
Są to odpowiednio: 5 i 5.
Jego analizaWartość*intBPtr
jest najpierw przypisany do*intAPtr
pierwszy.
Stają się więc: 3 i 3.
Potem obie*intAPtr
i*intBPtr
jest zwiększany o jeden.
Tak więc stają się odpowiednio: 4 i 4.
Moje WniebowzięcieMyślałem++
operator ma pierwszeństwo*
i=
, stąd moje twierdzenie.
Na przykład gdybyśmy mieli:
*intAPtr++;
Wynik powinien wynosić 2, prawda? Ponieważ najpierw zwiększamy wskaźnik, a następnie wyławiamy.
Dlaczego więc w powyższym przypadku, jak twierdzi, najpierw przypisujemy wartośćintBPtr
do wartościintAPtr
i zwiększyć wartości na koniec?
Po zebraniu wszystkich sugestii uruchomiłem kod w IDE, a wynik potwierdza, że @sujin:
Chociaż potwierdza to, że miałem rację przynajmniej pod względem pierwszeństwa:
Że:*intAPtr++ = *intBPtr++;
intAPtr++
ma wyższy priorytet, co prowadzi do:intAPtr
zwiększa swój adres o 1.
Teraz wskazując na: adres 2.
I podobnie:
intBPtr++
również zwiększa się o 1 (adres).
Teraz wskazując na: adres 5.
Więc to jest*
kolej:
Tak więc obydwa są dereferencjonowane (*) odpowiednio do 2 i 5.
Ale problem nadal istnieje, ponieważ powyższe przypisanie (=
) nie wydaje się mieć miejsca.
Gdyby tak się stało, oba stałyby się 5.
Nie mogę się doczekać dalszego oświecenia.