Ir ao conteúdo
  • Cadastre-se

C Não estou entendendo as variáveis


Corujomem

Posts recomendados

 

#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
Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

 

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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