Quinta-feira, 21 de Abril de 2011

Só para quem pensa que sabe C ou C++

Considere-se a expressão (***********printf)(&0["olá mundo!"]);
Isto é legal em C ou C++? Se sim, o que faz?


Notas iniciais:
  1. O operador * (deferenciar um ponteiro) é associativo à direita, ou seja: **a é o mesmo que *(*a);
  2. Uma função quando não está em contexto de ser invocada (ou seja, não tem parenteses à frente) converte-se num ponteiro para a função, ou seja: f é o mesmo que &f;
  3. Uma string constante ("entre aspas") é implementada como um array;
  4. O 'valor' de uma string constante é o endereço do seu primeiro elemento;
  5. O primeiro elemento de qualquer array em C é o de ordem 0 (zero);
  6. A prioridade do operador [] (indexação de array) é superior à prioridade do operador & (obtenção de endereço), ou seja: &a[b] é o mesmo que &(a[b])
  7. O operador [] (indexação de array) é comutativo, ou seja: a[b] é a mesma coisa que b[a]. A razão deste facto é que por definição a[b] é o mesmo que *(a+b), como a soma é comutativa é o mesmo que *(b+a) o que é o mesmo que b[a];
1ª parte: (***********printf)

Por 2) printf é o mesmo que &printf.
Logo, e tendo em atenção 1), *&printf é o mesmo que printf.
Por recursão conclui-se que (***********printf) é o mesmo que printf.

2ª parte: &0["olá mundo!"]

Aplicando 6) fica: &(0["olá mundo!"]).
Pela comutatividade 7) fica: &("olá mundo!"[0])
Tendo em conta 3), "olá mundo!"[0] é o primeiro caracter da string.
Logo aplicando & obtemos o endereço do 1º caracter.
Mas por 4) isso é o mesmo que ter a string "olá mundo!"

Conclusão:

O código inicial é o mesmo que printf("olá mundo");

publicado por @luis_grave às 16:03
link do post | comentar | favorito
|

.pub

.pesquisar

 

.posts recentes

. Tenho medo

. Facebook Important Messag...

. Adopção por um casal gay?...

. A DECO a pregar no desert...

. 16,7% de desemprego daqui...

. Este é o presidente de to...

. Não, não é montagem

. A censura da RTP Madeira

. A igreja católica e a mor...

. Vamos brincar às multas?

.Fevereiro 2014

Dom
Seg
Ter
Qua
Qui
Sex
Sab

1

2
3
4
5
6
7
8

9
10
11
12
13
14
15

16
17
18
19
20
21
22

23
24
25
26
27
28


.arquivos

.tags

. todas as tags

.mais sobre mim

blogs SAPO

.subscrever feeds