Заден план
Току-що разговаряхме с човек от C днес и не се съгласихме по следното:
int intgA[2] = { 1, 2 };
int intgB[2] = { 3, 5 };
int *intAPtr = intgA;
int *intBPtr = intgB;
Така че, когато правим:
*intAPtr++ = *intBPtr++;
Моят анализ
Първо:
intBPtr
се увеличава с единица, като сега сочи към адреса на 5. След това, уважение, запазвайки стойността 5;
intAPtr
също се увеличава с единица, като сега сочи към адреса на 2. Впоследствие препращане и стойността е 2;
Накрая:
2 се заменя с 5.
Така че съответно те са: 5 и 5.
Неговият анализ
Стойността на *intBPtr
първо се присвоява на *intAPtr
.
Следователно те стават: 3 и 3.
Тогава и *intAPtr
, и *intBPtr
се увеличават с единица.
Така съответно стават: 4 и 4.
Моето Успение
Мислех, че операторът ++
има предимство пред *
и =
, оттук и моето твърдение.
Например, ако имахме:
*intAPtr++;
Резултатът трябва да е 2, нали? Тъй като първо увеличаваме указателя и след това дереферираме.
Така че защо в горния случай, както той твърди, първо присвояваме стойността на intBPtr
на стойността на intAPtr
и увеличаваме стойностите последни?
След като взех всички предложения тук, пуснах кода в IDE и резултатът потвърждава този на @sujin:
Въпреки че потвърждава, че бях прав поне по отношение на приоритета:
Това: *intAPtr++ = *intBPtr++;
intAPtr++
има по-висок приоритет, което води до: intAPtr
увеличава своя адрес с 1.
Сега сочи към: адреса на 2.
И по същия начин:
intBPtr++
също се увеличава с 1 (адрес).
Сега сочи към: адреса на 5.
Тогава е ред на *
:
Така и двете се дереферират (*) съответно на 2 и 5.
Но проблемът все още съществува, тъй като заданието по-горе (=
) изглежда не е изпълнено.
Ако стане, и двете ще станат 5.
Очакваме с нетърпение да бъдем допълнително просветени.
intAPtr++
е постинкремент. Много е вероятно операциите за увеличаване да се появят последно, след присвояването. Опитахте ли да поставите този код в IDE и да го стартирате, за да видите какво прави? - person Robert Harvey   schedule 06.01.2014