O parêntesis na entrada significativo matriz

votos
0

Por que em algumas declarações de matrizes dinâmicas precisamos colocar nome de matriz entre parêntesis:

(*allocMat)[count++] = row;
Publicado 08/11/2018 em 06:53
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

É sobre a precedência do operador, ou seja, que parte da instrução é executada pela primeira vez.

Como na matemática simples. É x = a + b*cexecutado como x = (a + b)*cou como x = a + (b*c)?

Assim, para o seu código a pergunta é: é *"mais forte" do que []ou é o contrário?

Considere apenas fazendo:

*allocMat[count++] = row;

Como seria de esperar que para ser executado?

Como um:

(*allocMat)[count++] = row;

ou como B:

*(allocMat[count++]) = row;

A resposta é que ele é executado como B por isso, se você realmente quer um, então você precisa explícita adicionar o parêntese.

Um exemplo onde você gostaria Uma é quando allocMaté um ponteiro para uma matriz.

Um exemplo onde você gostaria B é quando allocMaté uma matriz de ponteiros.

Respondeu 08/11/2018 em 07:00
fonte usuário

votos
0

Allocmat é presumivelmente um ponteiro para uma matriz.

Os parênteses são necessários para obter a indireção corretamente. Então (*allocMat)[count++]é a mesma allocMat[0][count++]. Será que você omitir os parênteses, *allocMat[count++]seria igual a allocMat[count++][0]que é completamente diferente. Isto porque de precedência de operadores - []liga-se um pouco mais apertado do que *.

Respondeu 08/11/2018 em 06:57
fonte usuário

votos
0

Isto é devido à precedência do operador . O operador subscrito de matriz []tem prioridade mais alta que o operador desreferenciava unária *. Então, a menos que o parêntese é usado, uma declaração como

*allocMat[count++] = row;

será analisado como

* (allocMat[count++]) = row;

que não é desejado.

Para avaliar corretamente a declaração, é preciso primeiro excluir a referência o ponteiro, e depois, o índice para ele, como

(*allocMat)[count++] = row;

No trecho acima, allocMaté um ponteiro para uma matriz. Então, a menos que, o dereference é forçado a maior prioridade, o operador subscripting [], que tem maior prioridade, serão tidas em conta em primeiro lugar e irá resultar em avaliação incorreta.

Respondeu 08/11/2018 em 06:57
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more