Operadores e Laço For, contradição?

22 respostas
iwallas

Olá pessoal, tentei executar esse código:

for(int i = 0, j = 0, z = 0; z <= 3 || (i< 5 && j < 5); i++,j++,z++)
			System.out.println("i: " + i + " j: " + j + " z: " + z);

e saiu:

i: 0 j: 0 z: 0
i: 1 j: 1 z: 1
i: 2 j: 2 z: 2
i: 3 j: 3 z: 3
i: 4 j: 4 z: 4

Analisando o que fala no capítulo 4 (Operadores) do livro da kathy sierra:

O operador || : Sempre que a primeira condição for verdadeira retorna, não analisa a segunda.

Então nesse teste ai, o resultado deveria ser:

i: 0 j: 0 z: 0
i: 1 j: 1 z: 1
i: 2 j: 2 z: 2
i: 3 j: 3 z: 3

Pq está imprimindo a ultima linha “i: 4 j: 4 z: 4” (5ª rodada) se a primeira condição retorna true na 4ª rodada do loop, este não deveria parar?

22 Respostas

gbmesso

Sua pergunta foi boa também estou na dúvida… estou testando…

|| OU (“logical OR”) a || b retorna true se a ou b for true. Senão retorna false. Se a for true, b não é avaliada.

| OU (“boolean logical inclusive OR”) a | b retorna true se a ou b for true. Senão retorna false. Ambas expressões a e b são sempre avaliadas.

augusto_ab

… quando z = 3, então i = 3 e j = 3… certo…
na próxima iteração ficará z = 4, i = 4 e j = 4

então z <= 3 (false) || (i <5 && j < 5) (true)…

false || true = true…

por isso imprime i: 4 j: 4 z: 4…

:smiley:

augusto_ab

…a segunda expressão só não analizada quanda a primeira for verdadeira…

gbmesso

augusto_ab:
… quando z = 3, então i = 3 e j = 3… certo…
na próxima iteração ficará z = 4, i = 4 e j = 4

então z <= 3 (false) || (i <5 && j < 5) (true)…

false || true = true…

por isso imprime i: 4 j: 4 z: 4…

:smiley:

Isso na prova, se não tiver atento, confunde que é uma beleza.

Experimenta deixar seu código assim:

public class LacoFor
{

	public static void main (String args[])
	{

		for(int z = 0, i = 0, j = 0; z <= 3 || (i< 5 && j < 5); z++,i++,j++)
		{
 			System.out.println("z <= 3: " + (z <= 3) + " (i< 5 && j < 5): " + (i< 5 && j < 5));

 			System.out.println("i: " + i + " j: " + j + " z: " + z);
		}
 	}
 
}

Da pra ver como ele se comporta

J

No caso do ||, ele só não entra no laço se os dois argumentos passados forém falsos!!

Espero ter ajudado!!
Flw aew e t+!!

iwallas

mas está do lado direito do || !!! e No livro fala que primeiro lado esquerdo, depois lado direito, depois parenteses…

iwallas

eu entendi q na 4ª rodada, a primeira fica false e a segunda ainda é true, mas pela condição, não deveria parar quando a primeira z<=3 fosse true? se a primeira ja eh true, ele não teria que ignorar o que vem depois do || ? E se a primeira é true… não deveria parar o loop?

augusto_ab

se a condição é verdadeira porque deveria sair fora do laço ?!?

z = 1 true
z = 2 true
z = 3 true *
z = 4 false

maquiavelbona
Operador "||" (operador de curto circuito OU) estabelece as seguintes regras: ex:
int a =1;
int b =2;

if(a<5 || b<2){
do();
}
1. Se a primeira operação for VERDADEIRA(a<5), não analisa a segunda(b<2) e executa o bloco; 2. Se a primeira for FALSA, verifica a segunda. Se for VERDADEIRA entra no bloco, se FALSA, não executa o bloco. Diferentemente do "&&" (operador de curto circuito E), que estabelece a seguinte regra:
int a =1;
int b =2;

if(a<5 && b<2){
do();
}
1. Se a primeira operação for FALSA(a<5), não analisa o resto e NÃO entra no bloco; 2. Se a primeira for VERDADEIRA, verifica a segunda. Se for VERDADEIRA entra no bloco, se FALSA, não executa o bloco.

Sei que não foi muito didático, mas quaisquer dúvidas, avise.

Até!

[editado]exit() ia passar a idéia errada[/editado]

iwallas

for (ini ; condição de parada ; incrementa)

a condição de parada tem que ser TRUE, para não entrar no bloco não É(no caso do FOR)?

maquiavelbona

for(int i = 0, j = 0, z = 0; z <= 3 || (i< 5 && j < 5); i++,j++,z++) System.out.println("i: " + i + " j: " + j + " z: " + z);
Valores:

i: 0 j: 0 z: 0
i: 1 j: 1 z: 1
i: 2 j: 2 z: 2
i: 3 j: 3 z: 3
i: 4 j: 4 z: 4

O “condição de parada” pára o loop se o retorno total for FALSE. Então colocando nas situações:

i: 0 j: 0 z: 0 (true OU true = true) //Executa o loop e imprime
i: 1 j: 1 z: 1 (true OU true = true) //Executa o loop e imprime
i: 2 j: 2 z: 2 (true OU true = true) //Executa o loop e imprime
i: 3 j: 3 z: 3 (true OU true = true) //Executa o loop e imprime
i: 4 j: 4 z: 4 (false OU true = true) //Executa o loop e imprime
i: 5 j:5 z: 5 (false OU false = false) // Então não executa mais o loop

Até!

maquiavelbona

Caso fosse operador E (&&):

for(int i = 0, j = 0, z = 0; z &lt= 3 && (i&lt 5 && j &lt 5); i++,j++,z++) System.out.println(&quot;i: &quot; + i + &quot; j: &quot; + j + &quot; z: &quot; + z);
Valores:

i: 0 j: 0 z: 0
i: 1 j: 1 z: 1
i: 2 j: 2 z: 2
i: 3 j: 3 z: 3
i: 4 j: 4 z: 4

O "condição de parada" pára o loop se o retorno total for FALSE. Então colocando nas situações:

i: 0 j: 0 z: 0 (true E true = true) //Executa o loop e imprime
i: 1 j: 1 z: 1 (true E true = true) //Executa o loop e imprime
i: 2 j: 2 z: 2 (true E true = true) //Executa o loop e imprime
i: 3 j: 3 z: 3 (true E true = true) //Executa o loop e imprime
i: 4 j: 4 z: 4 (false E true = false)  // Então não executa mais o loop

Até!

iwallas

se for false?

ué então:

for(int i = 0; i<2; i++)
print("i: " + i);

vai imprimir até que i<2 seja true num é? Pq ela já é false no começo pq i=0 então i <> 2, logo retorna false.

Me desculpem… mas eu to mto confuso nisso ai… é true ou false pra parar o for?

maquiavelbona

iwallas:
se for false?

ué então:

for(int i = 0; i<2; i++)
print("i: " + i);

vai imprimir até que i<2 seja true num é? Pq ela já é false no começo pq i=0 então i <> 2, logo retorna false.

Me desculpem… mas eu to mto confuso nisso ai… é true ou false pra parar o for?

Você está confundindo ATÈ com ENQUANTO. Ele imprime ENQUANTO i<2 for TRUE.

iwallas

enquanto?? ué while, for… então o for é um while inrustido? se for isso… então entendi… !

Arcadex

Iwallas, enquanto a expressão for verdadeira ele continua.

Vc tem algo do tipo…

  1. V || V = V
  2. V || V = V
  3. V || V = V
  4. V || V = V
  5. F || V = V
  6. F || F = F sai do loop sem imprimir nada.

Blz ?

maquiavelbona

FOR é um loop da seguinte estrutura:
for( inicialização; enquanto essa estrutura for TRUE; termino do bloco)

No WHILE você só tem essa estrutura:
while(enquanto essa estrutura for TRUE)

For e while são estruturas de laço, que executam de maneiras parecidas.

Arcadex

iwallas:
for (ini ; condição de parada ; incrementa)

a condição de parada tem que ser TRUE, para não entrar no bloco não É(no caso do FOR)?

[color=red]Errado. É o contrário. Se a condição for verdadeira ele entra no bloco.[/color]

T

O “for” tradicional é realmente um “while” enrustido.

for (decl; cond; stmt) {
   bla;
}

é transformado pelo compilador no equivalente a:

{
    decl;
    while (cond) {
        bla;
        stmt;
    }
}
derheimen

O laço “for” declarado dessa forma :

for( ;true; ) { }

executa da mesma forma que um

while(true) { }

Passos da execução do laço “for”.

1º declara e inicializa os valores.
2º executa a condição, caso verdadeira, entra no bloco e faz algo.
3º incrementa o contador
4º executa a condição novamente.

É assim até que a condição seja falsa para poder finalizar a execução do laço.

iwallas

vlew pessoal! Agora entendi…

otaviofcs

Seu teste deveria ter no for:

e não

para dar o resultado q vc espera

Criado 11 de janeiro de 2007
Ultima resposta 11 de jan. de 2007
Respostas 22
Participantes 9