paulo1205
(usa Ubuntu)
Enviado em 28/05/2019 - 14:50h
DeuRuimDotCom escreveu:
Sim, tem razão. O "if" teoricamente pode ser substituído por operadores lógicos e o "switch" também; o "goto" quase não se usa. "Return" e "break" darão legibilidade, mas, de novo teoricamente, caberia uma gambiarra que falseasse a condição e terminasse o laço etc.... Claro, teríamos um código infernal de escrever, ler etc... Haveria algo além disso? (Como se isso fosse pouco...)
]
A lista que eu escrevi de comandos que não podem aparecer entre parênteses não foi exaustiva (por exemplo, eu não incluí nenhum comando de laços de repetição), mas a regra geral é que você só pode ter dentro de parênteses o que for constituído apenas de expressões.
O C facilita construir como expressões algumas coisas que em outras linguagens não seriam possíveis, graças, principalmente, ao operador ternário (“
a?b:c”), ao operador de sequenciamento (”
a,b”, sendo que tanto
a quanto
b podem ter contexto
void) e ao fato de que os operadores lógicos (
&& e
||) funcionam em curto circuito (o segundo operando não é avaliado se o primeiro for suficiente para determinar o valor final da operação lógica).
Mas mesmo isso não é suficiente para cobrir tudo. No caso de
if/
else, todos os comandos dentro do dois blocos, executados quando a condição testada é verdadeira e quando ela é falsa, teriam de consistir apenas de expressões ou poder ser reduzidos a expressões; se apenas um deles não puder ser reduzido a uma expressão, então todo o bloco de torna irredutível, e inviabiliza a transformação do
if em expressão.
O que, então, é ou não redutível a expressão?
Algumas coisas irredutíveis: desvios incondicionais (
goto,
break,
continue e
return) e também destinos desses desvios, declarações de variáveis, tipos e funções.
Coisas parcialmente ou condicionalmente redutíveis: condicionais, como
if e
switch, desde que todos os comandos sejam redutíveis (e, no caso do
switch, que os diferentes casos de uso não tenham
fall-through), laços de repetição (
for,
while,
do/
while) que possam ser reescritos na forma de funções recursivas (mas a definição dessa função não é redutível).
Mas mesmo que o código possa ser todo reescrito na forma de encadeamento de expressões, isso não significa que o código ficará tão legível ou eficiente quanto o código numa forma mais imperativa.
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)