Operacje wskaźnika i pierwszeństwo operatora w C

tło

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 analiza

Pierwszy:

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 analiza

Wartość*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ęcie

Myś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.

questionAnswers(6)

yourAnswerToTheQuestion