Isto é legal em C ou C++? Se sim, o que faz?
Notas iniciais:
- O operador * (deferenciar um ponteiro) é associativo à direita, ou seja: **a é o mesmo que *(*a);
- 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;
- Uma string constante ("entre aspas") é implementada como um array;
- O 'valor' de uma string constante é o endereço do seu primeiro elemento;
- O primeiro elemento de qualquer array em C é o de ordem 0 (zero);
- 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])
- 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");