• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

pmg

Micro puzzle

6 mensagens neste tópico

Estava a escrever um código e a certa altura escrevi isto

   if (--x) --x; /* explicação da expressão */

No código real a variável tem outro nome e o comentário é mais explícito, mas como é uma construção nova para mim achei que só o nome da variável não chegava para eu me lembrar da razão da expressão.

Puzzle: o que é que que pretendo com esta instrução?

Ou, por outras palavras, o que é que o comentário real tem?

PS Qual a versão mais bonita

if (--x) --x;

if (--x) x--;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu prefiro --x;

neste exemplo o uso do decremento em prefixo ou pósfixo não vai afectar o resultado da expressão

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu acho que depende do valor do i. Se o valor do i for 1, então ele vai ficar a 0, porque na expressão --i é decrementado de 1 para 0; depois é feito o if sobre um valor 0, e dará falso (não estou certo se será sobre o resultado da operação, ou mesmo sobre o valor 0).

Será que o código serve para não deixar passar valores negativos (embora isto só funcione se passasse um número maior que 0...) ?

Mantém-nos informados pmg!  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Puzzle resolvido por softclean :)

Usar if (--x) --x; ou if (--x) x--; é igual para os efeitos pretendidos.

Quanto à velocidade de cada um, acho que o compilador sabe melhor que eu o que fazer e que cria instruções iguais para as duas expressões. Mesmo que não o faça a diferença é certamente negligível.

O código faz parte do controle dum loop em que eu quero andar "para trás" de 2 em 2, mas sem passar o zero.

size_t x = strlen(src);
while (x) {
  /* código */
  if (--x) --x;
}

http://www.portugal-a-programar.pt/index.php?showtopic=23489

Ao correr uma versão anterior do código ele deu-me um erro estúpido, porque o x "ultrapassou" o zero ficando com 4294967295!

A versão actual do meu código já foi evoluindo e, embora já não seja necessário, ainda lá tem o if (--x) --x; :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora