Short-circuiting e &&

10 respostas
cv1

Galera, surgiu uma dúvida meio besta aqui. Eu tenho o seguinte codigo:

boolean a() { ... }
boolean b() { ... }
boolean c() { ... }

// ...

if(a() && b() && c()) {
  // executa apenas se a, b e c forem true
} else {
  // executa apenas se a, b e c forem false
}

O problema é que se a() for false, b() e c() não vão ser executados, e isso traz alguns problemas pra mim - eu vou precisar dos efeitos colaterais deles dentro do bloco else. Qual seria o melhor jeito de fazer isso de forma que a(), b() e c() fossem executados?

Às vezes a gente sente falta de uma linguagem que faça o que a gente quer dizer, não o que a gente diz :D

10 Respostas

ricardolecheta

não daria de colocar o resultado dos metodos em variáveis?

boolean a = a();

boolean b = b();


if(a && b && c) {

assim os métodos seriam executados…

urubatan

da para tirar os short circuit (substituir && por & )

mas o esquema complica no else, que em qualquer um dos casos, vai executar se a, e/ou b, e/ou c forem false, e não apenas se os 3 forem false.

para isto teria que armazenar os valores de retorno de a, b e c (para que eles não fossem executados novamente)
e transformar o else em else if (!(va && vb && vc)){}

ai, aqui o short circuit não tem mais problema :slight_smile:

maxguzenski

if(a() & b() & c())

dessa forma todos sao executados, e so entra no “if” se todos forem verdadeiros

cv1

Valeu gente, era isso mesmo :smiley:

Acabei usando a solução do urubatan, no fim das contas eu nao precisava entrar no else APENAS se a, b e c fossem false :slight_smile:

louds

usa a operacao de identidade do E com o OU que funciona:

a && b && c
fica
!(!a || !b || !c)

quem disse que faculdade é completamente inutil…

urubatan

segundo grau de eletrônica também tem isto ai :slight_smile:
mas não entendi o que tu quis dizer, o que tu colocou ali seria uma simples substituição, não elimina o short circuit

louds

tem razao
viajei total
vai causar exatamente o mesmo problema

G

Isto se chama satisfatibilidade

Seja H uma fórmula ;
H = (A ^ B ^ C ^ D)

é satifatível, se e somente se

I[A] = I[B] = I[C] = I[D] = T;

mas se…

I[A] = I[B] = T
I[C] = I[D] = F

A fórmula H é insatistatível

urubatan

agora fui eu quem viajou,
não entendi do que tu ta falando :slight_smile:

entendi a formula que tu colocou e tudo,
mas isto tem a ver com o que mesmo??
se não me engano tu só explicou matematicamente como descobrir se uma “formula” é verdadeira ou falsa :slight_smile:

G

é, eu só expliquei matematicamente, só que usando síbolos da lógica proposicional.
Eu só bati o olho na pergunta e tive uma sacada, que só seria executado algo se fosse satisfatível… hehehe…
agora eu usaria o loop switch

switch(...) {
    case n: ... break;
    default: ... ;
}

(também num to entendendo nada hehehe)

Criado 30 de maio de 2003
Ultima resposta 31 de mai. de 2003
Respostas 10
Participantes 6