Um macete perigoso em C/C++

Nos posts anteriores você viu que é possível derreferenciar um ponteiro através do operador [] e colocar o offset tando dentro quanto fora dos parênteses. Ou seja, a[2] é a mesma coisa que 2[a], que é a mesma ciopsa que *(a + 2).

Mas você já topou com uma situação em que quisesse fazer isso ai em baixo?

(x > 0 ? a : b) = 3;

Ou seja, uma forma “simplificada” de escrever:

if (x > 0)
  a = 3;
else
  b = 3;

Se você tentar usar o operador ? dessa forma vai tomar o seguinte erro nas fuças:

error: lvalue required as left operand of assignment

lvalue é uma expressão que pode ser assinalada. O operador ? não devolve esse tipo de expressão… O que fazer? Ora, um ponteiro pode ser assinalado! Uma solução simples, mas potencialmente perigosa, dependendo do código, é trabalhar com ponteiros:

*(x > 0 ? &a : &b) = 3;

Isso se você quiser deixar alguém que vá ler o seu código maluco! Mas, funciona!

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s