Como ler uma expressão complexa c ++
C ++ é cheia de pequenos símbolos, cada um dos quais contribui para o significado de expressões. As regras de gramática C ++ são tão flexíveis que esses símbolos podem ser combinados em combinações quase impenetrável complexos. Expressões na linguagem C mais simples pode ficar tão obtuso que costumava haver um concurso anual para que pudesse escrever o programa mais obscuro e que poderia compreendê-lo.
Conteúdo
Nunca é uma boa idéia para tentar escrever código complexo, mas às vezes você vai se deparar expressões em C ++ que são um pouco desconcertante à primeira vista. Basta usar as seguintes etapas para entendê-los:
Comece com os parênteses mais incorporados.
Comece a olhar para os exteriores maioria dos parênteses. Dentro daqueles, procure parênteses incorporados. Repita o processo até que você trabalhou seu caminho para o par mais profundo de parênteses. Começar a avaliar que subexpression primeiro usando as seguintes regras. Depois de entender que a expressão, pop de volta para o próximo nível e repita o processo.
Dentro do par de parênteses, avaliar cada operação na ordem de precedência.
A fim de que os operadores são avaliados é determinada pela prioridade do operador mostrado na tabela. Indireção vem antes de multiplicação que vem antes disso, assim, a seguir adiciona 1 mais 2 vezes o valor apontado para pelo * ptr.
int i = 1 + 2 * * ptr-
Precedência | Operador | Significado |
---|---|---|
1 | () (Unária) | Invocar uma função |
2 | * E -gt; (Unária) | Dereference um ponteiro |
2 | - (unária) | Retorna o negativo de seu argumento |
3 | ++ (Unária) | Incremento |
3 | - (unária) | diminuição |
4 | * (binário) | Multiplicação |
4 | / (binário) | Divisão |
4 | % (binário) | Modulo |
5 | + (binário) | Adição |
5 | - (binário) | Subtração |
6 | && (binário) | E lógico |
6 | !! | lógico OR |
7 | =, * =,% =, + =, - = (especial) | tipos de atribuição |
Avaliar as operações com a mesma precedência da esquerda para a direita (exceto cessão, que vai para o outro lado).
A maioria dos operadores da mesma precedência avaliar a partir da esquerda para a direita. Assim, a seguir adiciona 1-2 e adiciona o resultado para 3:
int i = 1 + 2 + 3
A ordem de avaliação de alguns operadores não importa. Por exemplo, a adição funciona da mesma da esquerda para a direita, como ele faz da direita para a esquerda. A ordem de avaliação faz muita diferença para algumas operações como divisão. Os seguintes divisões 8 por 4 e divide o resultado de 2:
int i = 8/4 / 2-
A principal excepção a esta regra é atribuição, que é avaliada da direita para a esquerda:
Video: Programar em C - Desafio | Como Calcular o Fatorial de Um Número - Aula 12
a = b = c-
Isso atribui C para B e o resultado para um.
Avaliar subexpressions em nenhuma ordem particular.
Considere a seguinte expressão:
int i = f () + G () * h () -
A multiplicação tem precedência mais alta, de modo que você pode assumir que as funções g () e h () são chamados antes de f (), no entanto, este não é o caso. chamada de função tem a maior precedência de todos, para todas as três funções são chamadas quer antes da multiplicação ou a adição é realizada. (Os resultados retornados a partir g () eh () são multiplicados e, em seguida, adicionados aos resultados retornados a partir de f ().)
Video: Matemática Básica - Aula 5 - Expressões numéricas
A única vez que a ordem em que as funções são chamadas faz a diferença é quando a função tem efeitos colaterais, como abrir um arquivo ou alterar o valor de uma variável global. Você definitivamente não deve escrever seus programas para que eles dependem este tipo de efeitos colaterais.
Executar quaisquer conversões de tipo somente quando necessário.
Video: Curso C++ - Aula 07 - Indentação, Espaço em Branco e Ponto e Vírgula
Você não deve fazer mais conversões de tipo do que o absolutamente necessário. Por exemplo, a seguinte expressão tem, pelo menos, três e, eventualmente, de quatro conversões de tipo:
flutuar f = `a` + 1-
O caractere ‘a’ deve ser promovido para um int para executar a adição. O int é então convertido para um casal e depois convertidos para um único precisão float. Lembre-se que toda a aritmética é realizada tanto em int ou dupla. Geralmente, você deve evitar a execução de aritmética em tipos de caracteres e evitar precisão simples flutuador completamente.
Video: Operadores Lógicos e Relacionais - Curso de Algoritmos #04 - Gustavo Guanabara