Dúvida while avançado [RESOLVIDO]

1. Dúvida while avançado [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 06/03/2019 - 20:12h

Analisem o exemplo abaixo:
int main(void){ // Loop infinito! Cuidado
int Numero = 7; // Dou um valor ao Numero

while((Numero = 9) != 0) // Dou o valor 9 ao while enquanto comparo ele, logo ele nunca será 0 pois ele recebe o valor antes de comparar
// Aqui Numero sempre terá valor 9

Numero = 1; // Dou um valor diferente de 0 para manter o Loop
}

No exemplo acima eu uso um while um pouco mais avançado, atribuindo um valor a uma variável qualquer e comparando também uma variável
Mas eu queria fazer um comando parecido mas do TIPO abaixo
int main(void){
int Numero = 7; // Dou um valor ao Numero

// while((Numero != 0) == 9) // Tentei isso mas não funcionou
while(Executa enquanto Numero != 0, APÓS CHECAR se o valor dele é diferente, Então ele dá o valor 9 para Numero)
Numero = 0; // CANCELO O Loop
}

Os únicos exemplos complexos de while são usando ( E, OU) O que não me servem claro, eu preciso de um ATRIBUIDOR igual posso fazer em um FOR

OBS IMPORTANTE: Minha pergunta é somente sobre o que o while é capaz de fazer, suas possibilidades, estou estudando ele.
Logo respostas para solucionar o problema em si, não me ajudarão, do tipo, use um for, ou coloque a variável abaixo da linha do while, nada disso me ajuda, porque isso eu sei fazer!

O que desejo é saber se é possível fazer o que quero naquela linha informada apenas, e USANDO o while


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/03/2019 - 22:40h

while(numero!=0 && (numero=9)){ /* bla, bla, bla */ } 


Na verdade, sendo mais específico e respondendo à sua pergunta sobre os limites do que se pode fazer dentro do bloco de condições do while (ou if, ou for, ou talvez até de switch), a resposta é aquilo que pode formar uma expressão.

E o que pode formar uma expressão? Um monte de coisas, especialmente por causa do comportamento de curto-circuito dos operadores lógicos && e ||, e mais ainda graças ao operador de sequenciamento ,, que nem ao menos exige que os operandos de cada lado possuam valores (i.e. podem ser chamadas a funções com tipo de retorno void).

Por exemplo, o seguinte programa, embora sem sentido, é sintaticamente válido.

#include <stdio.h>
#include <stdlib.h>

void f(){}

int main(int argc, char **argv){
// Um if sem usar if.
argv[0] && argv[0][0] && printf("Programa foi invocado com nome \"%s\".\n", argv[0]);

// Acima funciona porque printf() retorna int. Se fosse uma função que retorna void,
// seria necessário sintetizar um inteiro para poder usar com || ou &&. O operador
// , serve nesses casos.
(f(), 0) || printf("Esta mensagem sempre será impressa.\n");
(f(), 1) || printf("Esta mensagem nunca será impressa.\n");

// Exemplos dentro de comandos que exigem expressões.
int x=5;
while(x!=0 && (x=9)){
x=rand();
}
if(x=1, f(), --x){
printf("Esta mensagem nunca será impressa.\n");
}
}


O que não é possível colocar como expressões são os próprios comandos da linguagem (incluindo blocos de comandos) e do preprocessador. além de declarações. Macros com aspecto de função podem funcionar ou não, dependendo de se elas incluem ou não elementos que não são válidos em expressões.

// Macro que produz expressão do mesmo tipo de seu argumento x: pode ser usada com “,”.
#define increment(x) (++(x))

// Macro que produz expressão do (pseudo-)tipo void: pode ser usada com “,”.
#define increment_void ((void)(++(x)))

// Macro que usa comando: não pode ser usada com “,”.
#define increment_cmd(x) do { ++(x); } while(0)


Contudo, essas coisas devem ser usadas com moderação. Em muitos casos, elas diminuem a legibilidade do código.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)

3. Re: Dúvida while avançado

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 06/03/2019 - 21:05h

Nick-us escreveu:
Minha pergunta é somente sobre o que o while é capaz de fazer, suas possibilidades, estou estudando ele.

O que desejo é saber se é possível fazer o que quero naquela linha informada apenas, e USANDO o while


Não sei se entendi o que você tem em mente, mas em C o comando while faz basicamente o mesmo que o for. Todavia, no primeiro apenas o teste condicional deve ser escrito dentro dos parênteses, com ou sem atribuição, pouco importa. Se com, seu valor de retorno é que será testado.

Em tempo: Se quiser usar loop infinito, basta fazer o seguinte:

while(1){
<comandos>}

E usar, para parada, o break ou, conforme o caso, o return .



4. Re: Dúvida while avançado [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 06/03/2019 - 21:40h

DeuRuimDotCom escreveu:Não sei se entendi o que você tem em mente, mas em C o comando while faz basicamente o mesmo que o for.
Em tempo: Se quiser usar loop infinito, basta fazer o seguinte:

while(1){
<comandos>}

E usar, para parada, o break ou, conforme o caso, o return .

Tipo vc não entendeu mesmo! O Código que escrevi é apenas um exemplo, poderia ser até um Menu ou Cadastro de pessoas.
Eu me refiro no exemplo, apenas a linha do While.

E explico que estou TENTANDO escrever um while COMPOSTO, ou seja com mais COMANDOS. Não 1 apenas.
E ele não é igual ao FOR, porque eu POSSO fazer o que quero se eu usar um FOR.

OBS Não sei de onde vc tirou a idéia que eu queria criar um LOOP Infinito. Eu não quero criar nada, nem mesmo nenhum programa! Nem nenhum algoritimo!

Como expliquei na pergunta: Eu quero saber o que POSSO ou não posso fazer usando um while. Em toda a Internet somente achei exemplos simples de uso do while. Porém pode sim existir uma forma mais COMPLEXA pra usar ele. Pois venho descobrindo formas de programar que NÃO EXISTEM em exemplos na Internet.

O que quero na mesma linha do while é usar mais do que 1 OPÇÃO. Eu já sei usar 2 OPÇÕES e posso usar INFINITAS opções usando E ou OU na mesma linha.
Quero saber se posso colocar MINHA EXPRESSÃO matemática que informo na minha pergunta, na MESMA linha da palavra WHILE DENTRO dos PARENTESES ()

EXEMPLO: while (QUERO AQUI MINHA CONDIÇÃO COMPLEXA)
que não é apenas uma comparação! E sim, uma COMPARAÇÃO e Atribuição de VALOR.

OUTRO EXEMPLO: while(ENQUANTO Numero for diferente de ZERO, SE FOR DIFERENTE DE ZERO DE A Ele o VALOR Numero = 9)
Então embaixo outras coisas mas NÃO QUERO COLOCAR nada da minha Expressão acima, AQUI EM BAIXO.

OBS Não quero fazer Loop Infinito e não quero criar NENHUM programa! É apenas um exemplo, que acho que eu nem deveria ter feito! talvez eu devesse apenas ter COLOCADO uma linha! Só que eu preferi escrever o exemplo para facilitar para quem deseja testar a condição!







5. Re: Dúvida while avançado [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 06/03/2019 - 21:51h

DeuRuimDotCom escreveu:Se quiser usar loop infinito, basta fazer o seguinte:

while(1){
<comandos>}

E usar, para parada, o break ou, conforme o caso, o return .

Ainda tentando ser mais CLARO olhe apenas a linha que quero
// LEIA POR FAVOR! Essa Linha eu faço 2 COISAS. 2 COISAS!. EU DOU o valor 9 para NÚMERO, E Depois Eu comparo se Numero é IGUAL a ZERO 
while((Numero = 9) != 0)
// RIDÍCULO? SIM, não importa. O que quero dizer que fiz 2 COMANDOS
// Não precisa me dizer que Numero NUNCA SERÁ ZERO pq JÁ SEI! Entendeu?

O que EU QUERO
2 COMANDOS APENAS. Iguais ao que eu fiz no exemplo acima!
Mas dessa vez eu quero: COMPARAR se Numero é ZERO, e DEPOIS se ele não FOR ZERO, eu dou o valor para ele de 9

OBS IMPORTANTE: Não quero fazer FORA dos PARENTESES do While! ENTENDEU?
Ou seja while(TEM QUE FUNCIONAR AQUI DENTRO)
Não do lado de fora!

Repetindo mais uma vez. Não estou querendo criar nenhum algoritimo! Quero saber se POSSO ou não, se EXISTE ou não uma forma de fazer o que eu quero!


6. Re: Dúvida while avançado [RESOLVIDO]

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 06/03/2019 - 22:01h

while(numero == 0 ? numero : numero=9)


7. Re: Dúvida while avançado [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 06/03/2019 - 22:10h

DeuRuimDotCom escreveu: while(numero == 0 ? numero : numero=9)

É por ai mesmo... só que não funcionou o que vc escreveu, pode ter algo errado ai que não descobri. Tentei assim
int main(void){
int Numero = 7;
while(Numero == 0 ? Numero : Numero = 9)
Numero = 1;
}

Erros apresentados:
bash-4.4$ gcc Test.c
Test.c: In function ‘main’:
Test.c:6:40: error: lvalue required as left operand of assignment
while(Numero == 0 ? Numero : Numero = 9)
^
bash-4.4$


Sabe o que deu errado?


8. Re: Dúvida while avançado [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 06/03/2019 - 22:21h

DeuRuimDotCom escreveu: while(numero == 0 ? numero : numero=9)

Corrigi, vc apenas esqueçeu de um parenteses na atribuição!
int main(void){
int Numero = 7;
while(Numero == 0 ? Numero : (Numero = 9))
Numero = 1;
}

Agora sim! AMEI sua resposta, mesmo que com um errinho apenas, mas sua resposta resolveu o que eu quis, e me deu mais opções para estudar operações ternárias! Isso sim não apenas me ajudou na pergunta, mas com futuros problemas ou idéias que usarei.
Muito Obrigado


9. Re: Dúvida while avançado [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 06/03/2019 - 22:23h

Aguardando agora apenas vc EDITAR sua resposta com a correção dos parenteses para eu fechar e escolher ela como melhor resposta!
Para depois quem for ler, não pegar uma resposta errada!


10. Re: Dúvida while avançado

Nick Us
Nick-us

(usa Slackware)

Enviado em 06/03/2019 - 22:54h

paulo1205 escreveu:
while(numero!=0 && (numero=9)){ /* bla, bla, bla */ } 

Outro bom exemplo. Também funciona, testei aqui! Eu cheguei a imaginar que existisse sim uma forma assim como essa que vc escreveu! Também estou guardando esse exemplo. Apenas não posso escolher nesse momento sua resposta pq o DeuRuimDotCom respondeu anteriormente, estou apenas aguardando ele consertar a resposta para marcar a dele como melhor resposta, porque marcar ela agora estando ela com erros, pode confundir quem ler o tópico posteriormente!


11. Re: Dúvida while avançado [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/03/2019 - 23:11h

Editei a resposta anterior para ficar mais completa. Reveja-a, por favor.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


12. Re: Dúvida while avançado

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/03/2019 - 23:43h

Uma observação quanto ao operador de sequenciamento (,): as vírgulas que aparecem nas chamadas de função para separar seus diferentes argumentos são distintas do operador de sequenciamento, e têm prioridade na análise sintática. Embora visualmente semelhantes, os dois comandos abaixo interpretam as vírgulas entre parênteses de modo muito distinto.
if(a, b){ }  // operador de sequenciamento, que produz valor final b (após ter avaliado a).

func(a, b); // Chama a função com dois argumentos: a e b.


Se você quiser usar o operador de sequenciamento numa expressão que seja avaliada dentro de uma invocação de função, tem de colocar a operação em que ele aparece entre parênteses.
func((a, b), (c, d));  // invoca func(b, d), depois de avaliar também a e c 


Ainda outra observação: quando usada como operador de sequenciamento, a vírgula tem um sentido claro de avaliação de cada componente da expressão composta, ordenada da esquerda para a direita. mas quando usada como separador de argumentos de função, não existe nenhuma garantia quanto à ordem de avaliação de cada argumento. Assim sendo, o exemplo anterior garante apenas que a será avaliado antes de b e c será avaliado antes de d, mas não que a e b sejam avaliados antes de c e d ou vice-versa.

Isso é importante num caso geral em que as diferentes expressões que compõem argumentos de funções possam ter interdependências. O código abaixo produz uma saída imprevisível, que pode variar de uma máquina para outra e mesmo entre diferentes configurações e opções de compilação numa mesma máquina.
int x=0;
printf("%d, %d\n", ++x, ++x);



... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts