Ir ao conteúdo
  • Cadastre-se
jlukinha

RESOLVIDO Duvida operando com a mesma variável com operadores aritimeticos

Recommended Posts

Olá pessoal. Eu gostaria de saber por que o programa abaixo: 

 

#include <stdio.h>  int main() {   int b=0;                       for (int a=1; a<=10; a++){                       printf("\n %2i          %i",b+=2,b+=5);    }  }  
   
Me dá esse resultado: 
   
7         7
14     14
21     21
28     28
35     35
42     42
49     49
56     56
63     63
70     70 
 
 Ao invés desse 
 
  2     5   
  4   10
  6   15
  8   20
10   25
12   30
14   35
16   40
18   45
20   50 
 
Por que os resultados de %i correspondentes a b+=2 não são mostrados independente dos resultados de %i correspondentes a b+=5? Agradeço pelas respostas.
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@jlukinha

 

 

Interessante.. típica questão que poderia cair em concurso.

 

 

EDIT

 

 

Se atribuirmos um valor a b no primeiro argumento, este será assumido como o valor final de b; a expressão seguinte será descartada:

 

Note que os resultados dos exemplos mostrados abaixo podem variar conforme o compilador utilizado. Então, não vale a pena e nem seria recomendado contar com o comportamento de uma implementação específica de compilador para obter resultados exclusivos. O rjjj jogou luz sobre essa questão.

 

Nos compiladores que testei, a ordem de avaliação dos argumentos na chamada da função foi de direita para esquerda. Essa ordem de avaliação também é não-especificada.

 

 

Esses são os resultados produzidos:

printf("%2i          %i", b = 5, b += 2);

gcc: 5 5

TC: 5 2

printf("%2i          %i", b += 5, b = 2);

gcc: 7 7

TC: 7 2

 

 

No seu caso:

printf("%2i          %i", b += 2, b += 5);

gcc: o resultado que você apresentou. As duas expressões são resolvidas primeiro antes de b assumir o valor final.

TC:

7 5

14 12

21 19

etc.

 

 

*TC = Turbo C

 

 

Abs.

LNW

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na execução do seu código, a função printf a cada ciclo do loop recebe dois números provenientes de operações com a variável b, sendo que esses valores primeiro são numericamente determinados e só depois passados como argumentos de função F5Rua4D.gif.

 

 

 

Contudo, em termos de tempo, a ordem de avaliação das expressões direcionadas aos parâmetros do printf é por padrão inespecificada. No seu caso, pode-se dizer que o seu compilador determina que as expressões b+=2 e b+=5 sejam processadas em uma certa ordem e que depois disso a função printf receba os resultados, iguais ao valor final de b, como argumentos.

 

 

 

Espero ter ajudado GbhmuXl.gif.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Contudo, em termos de tempo, a ordem de avaliação das expressões direcionadas aos parâmetros do printf é por padrão inespecificada.

 

Sim.. realmente, acabei de confirmar. No Borland Turbo C, os valores divergem dos produzidos pelo gcc. ;)

 

 

 

 

 

Abs.

LNW

Compartilhar este post


Link para o post
Compartilhar em outros sites

@jlukinha

 

 

Interessante.. típica questão que poderia cair em concurso.

 

 

EDIT

 

 

Se atribuirmos um valor a b no primeiro argumento, este será assumido como o valor final de b; a expressão seguinte será descartada:

 

Note que os resultados dos exemplos mostrados abaixo podem variar conforme o compilador utilizado. Então, não vale a pena e nem seria recomendado contar com o comportamento de uma implementação específica de compilador para obter resultados exclusivos. O rjjj jogou luz sobre essa questão.

 

Nos compiladores que testei, a ordem de avaliação dos argumentos na chamada da função foi de direita para esquerda. Essa ordem de avaliação também é não-especificada.

 

 

Esses são os resultados produzidos:

printf("%2i          %i", b = 5, b += 2);

gcc: 5 5

TC: 5 2

printf("%2i          %i", b += 5, b = 2);

gcc: 7 7

TC: 7 2

 

 

No seu caso:

printf("%2i          %i", b += 2, b += 5);

gcc: o resultado que você apresentou. As duas expressões são resolvidas primeiro antes de b assumir o valor final.

TC:

7 5

14 12

21 19

etc.

 

 

*TC = Turbo C

 

 

Abs.

LNW

Obrigado pela resposta, embora eu ainda não tenha compreendido. Eu estou usando o livro "Programming in C" do Stephen G. Kochan pra aprender C e ,futuramente, C++. Pelo que eu vi no livro, ele só trata de Argumentos no Capítulo 8, onde eu ainda não estou. Então, eu vou continuar e depois volto aqui para entender a sua pergunta. Eu cheguei nesse problema quando fui resolver um exercício do livro, que consistia em representar duas colunas: uma com números de 1 a 10 e outra coluna com esses números elevados ao quadrado. Eu não me lembro como eu fiz o programa. Só sei que, no auge da minha burrice, o programa não relacionava os números aos seus respectivos quadrados. Acabou que eu fui explorando esse erro e cheguei ao problema que eu apresentei aqui. Bem, é isso, obrigado por me responder e espero compreender isso alguns capítulos à frente.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×