Operações de ponteiro e precedência do operador em C
Acabamos de conversar com um cara C hoje e discordamos sobre o seguinte:
int intgA[2] = { 1, 2 };
int intgB[2] = { 3, 5 };
int *intAPtr = intgA;
int *intBPtr = intgB;
Então, quando fazemos:
*intAPtr++ = *intBPtr++;
Minha análisePrimeiro:
intBPtr
incrementa em um, agora apontando para o endereço de 5. Em seguida, deferência, mantendo o valor 5;
intAPtr
também aumenta em um, agora apontando para o endereço de 2. Referenciando subseqüentemente e o valor é 2;
Por último:
2 é substituído por 5.
Então, respectivamente, são eles: 5 e 5.
A análise deleO valor de*intBPtr
é atribuído primeiro a*intAPtr
primeiro.
Portanto, eles se tornam: 3 e 3.
Então ambos*intAPtr
e*intBPtr
é incrementado em um.
Então, respectivamente eles se tornam: 4 e 4.
Minha AssunçãoEu pensei que o++
operador tem precedência tanto*
e=
, daí a minha afirmação.
Por exemplo, se tivéssemos:
*intAPtr++;
O resultado deve ser 2, certo? Porque primeiro incrementamos o ponteiro e depois a desreferencia.
Então, por que, no caso acima, como ele afirma, primeiro atribuímos o valor deintBPtr
para o valor deintAPtr
e incrementar os valores por último?
Depois de ter recebido todas as sugestões aqui, executei o código no IDE e o resultado confirma o do @sujin:
Embora confirme que eu estava certo, pelo menos em termos de precedência:
Naquela:*intAPtr++ = *intBPtr++;
intAPtr++
tem uma precedência mais alta, o que leva a:intAPtr
incrementa seu endereço em 1.
Agora apontando para: o endereço de 2.
E da mesma forma:
intBPtr++
também aumenta em 1 (endereço).
Agora apontando para: o endereço 5.
Então é*
é a vez de:
Portanto, os dois são desreferenciados (*) para respectivamente 2 e 5.
Mas o problema ainda existe porque a atribuição acima (=
) parece não ter ocorrido.
Se isso acontecesse, ambos seriam 5.
Ansioso para ser mais esclarecido.