Como ler um Complexo Expression 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 pudesse compreendê-lo.

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:

  1. 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.

  2. 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 da multiplicação que vem antes da adição, assim, a seguir adiciona 1 mais 2 vezes o valor apontado para pelo * ptr.

int i = 1 + 2 * * ptr-
Operadores em ordem de precedência
PrecedênciaOperadorSignificado
1() (Unário)Invocar uma função
2* E -> (unário)Dereference um ponteiro
2- (Unário)Devolve o negativo de seu argumento
3++ (Unário)Incremento
3-- (Unário)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!!OU lógico
7=, * =,% =, + =, - = (Especial)tipos de atribuição
  1. 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 a partir da esquerda para a direita como o faz a partir da direita para a esquerda. A ordem de avaliação faz muita diferença para algumas operações como divisão. As seguintes divisões 8 por 4 e divide o resultado por 2:

    int i = 8/4 / 2-

    A principal excepção a esta regra é atribuição, que é avaliada da direita para a esquerda:

    a = b = c-

    Isso atribui C para B e o resultado para um.

  2. 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 precedência mais alta 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 de G () eh () são multiplicados e, em seguida, adicionados aos resultados retornados a partir de f ().)

    O único momento em que a ordem em que as funções são chamadas faz com que a diferença é, quando a função tem efeitos secundários tais como a abertura de um arquivo ou alterando o valor de uma variável global. Você definitivamente não deve escrever seus programas para que eles dependem deste tipo de efeitos colaterais.

  3. Executar quaisquer conversões de tipo somente quando necessário.

    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 possivelmente quatro conversões de tipo:

    flutuar f = 'a' + 1-

    O caractere 'a' deve ser promovido para um int para realizar a adição. O int é então convertido a um duplo e, em seguida, convertido para baixo para um único flutuador precisão. Lembre-se que toda a aritmética é realizada quer em int ou dupla. Geralmente, você deve evitar a execução de aritmética em tipos de caracteres e evitar precisão única bóia completamente.

menu