Ir ao conteúdo

Posts recomendados

Postado

 

#include <stdio.h>

main()
{
    int num=2;
    printf("%d,%d,%d",num=123,num+2,num);

}

Pessoal eu sou meio novato na área de programação e me deparei com esse problema. Pelo que eu estudei as variáveis são reconhecidas da direita para esquerda, então o que deveria sair não seria "123,4,2" ou "123,125,123" em vez de "123,4,123"?

  • Curtir 1
Postado
8 minutos atrás, Valter Francisco Ramos disse:

Na verdade a saida deverá ser 123,125,123, pois você está mudando o valor da variável num (num=123) e sobrescreve o valor inicial de 2 (num=2).

mas o que é escrito é justamente "123,4,123", daí a fonte da minha dúvida

Postado

@Corujomem , também não sabia disso, genial.

 

43 minutos atrás, Corujomem disse:

Pelo que eu estudei as variáveis são reconhecidas da direita para esquerda

Exato! O padrão de conversão de chamada é essa, o último argumento da lista é o primeiro parâmetro a ser colado (os valores) na pilha de chamada da função.

 

22 minutos atrás, Valter Francisco Ramos disse:

Na verdade a saida deverá ser 123,125,123, pois você está mudando o valor da variável num (num=123) e sobrescreve o valor inicial de 2 (num=2).

E não é!

 

Supondo que apenas os valores se pode registrar, o programa resolve todas operações nos parâmetros (tornando-as em valores) na ordem da conversão de registro para só assim depois aplicar a mesma ordem no registramento dos valores.

 

Sendo assim se você coloca uma operação no final também, por exemplo:

printf("%d,%d,%d",num=123,num+2,num+1);

 

verá o exemplo no padrão

44 minutos atrás, Corujomem disse:

são reconhecidas da direita para esquerda

 

 

 

  • Amei 1
Postado

 

printf("%d,%d,%d",num=123,num+2,num+1);

isso escreveria "123,4,3"

caso mude o "1" do "num+1" por qualquer outro valor diferente de zero a variável "num" será reconhecida como 2, porém, caso "num+1" seja substituído por "num+0" ou por qualquer outra operação que retornaria algo parecido, a variável "num" novamente passa a ser 123 a única forma então para escrever a variável como 2 seria com uma nova linha?

  • Curtir 1
Postado
33 minutos atrás, Corujomem disse:

a variável "num" novamente passa a ser 123 a única forma então para escrever a variável como 2 seria com uma nova linha?

Não! Pois posso operar com uma variável nula na operação: num+variavel, sendo que variavel é igual a 0.

 

No caso de adição com 0, o copilador otimiza o código sempre antes de compilar e isso pode excluir algumas operações 😆 neutras (soma a+0 é a), por conta do 0 ser uma constante literal.

 
Exemplo que funciona:
    int nulo= 0;


    printf("%d,%d,%d",num=123,num+2,num+nulo);

Observação: num= 123 é igual a num

 

 

 

  • Curtir 1
Postado

Olá

 

O melhor é esquecer que isso é possível e NUNCA usar essas coisas: atribuições em meio a listas de argumentos para chamadas de função. O resultado vai depender do modo como o compilador avalia as expressões e eu prefiro nem pensar nisso. 

 

Quando o compilador prepara a lista de argumentos para chamar uma função, como esse caso da printf(), está claro que ele vai montar os parâmetros da esquerda para a direita e tal. Mas acho que a norma não estabelece como tratar atribuições em meio à lista.

 

Veja algo mais ilustrativo e teste no seu compilador:

#include <stdio.h>

int main(int argc, char** argv)
{
    int num = 2;
    printf("%d,%d,%d\n", num=123, num+2, num);
    printf("%d\n", num);
    printf("%d,%d,%d,%d\n", num, num = 2, num + 2, num);
    printf("%d,%d,%d,%d\n", num, num = 2, num = 3, num);
    printf("%d,%d,%d,%d\n", num=1, num=2, num=3, num);
    return 0;
}

No meu compilador, Visual Studio 2019 versão 16.2.3 faz isso:

123,125,123
123
2,2,4,2
2,2,2,2
1,1,1,1

Nos último printf() dá pra entender que no caso desse compilador ele só avalia a primeira atribuição que encontrar.

 

Meu conselho grátis: jamais escreva isso.

Eu agradeceria se os leitores testassem em outros compiladores e mostrassem aqui o resultado. Estou curioso mas não o suficiente para ir pra máquina do lado e testar no gcc :D

 

E note que o pesadelo é maior ainda porque mesmo sem mudar de compilador muitas opções de compilação vão afetar a geração do código

 

2 horas atrás, MB_ disse:

E não é!

Ou é, como no meu compilador.

 

 

Repito: sugiro que não escrevam essas coisas nos seus programas.

Postado
45 minutos atrás, MB_ disse:

No GCC (livre) por exemplo, ocorre tudo como esperado.

 

podia postar a saída daquele código de 10 linhas que eu postei, e quem sabe a versão do gcc 😉

Alguém poida acrescentar a saída para outros compiladores?

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...