Ajuda com comando while

Olá, eu tenho uma duvida referente ao comando while, eu entendo quando tem uma comparação dentro do comando while como por exemplo :

#include<stdio.h>

int main(){
    int x =2;
    while(x==2){
        printf("digite 1 para sair e 2 para continuar\n");
       scanf("%d",&x);
    }
    printf("saiu");
}

porem recentemente me deparei com um while desse jeito aqui :

while ((c =c/t)) 

Como funciona o while no caso quando não se tem um operador de comparação como ==, <, >, etc, e sim um operador de atribuição como no caso em cima?

Para as instrulções if, while, do/while e for, a condição de parada (termo técnico muito utilizado) para linguagem c (não posso afirmar se para c++ é igual porque não conheço) é que tudo o que for diferente de zero é considerado true, zero é false, logo…

while (1) {
    ...
}

Em linguagens modernas seria o mesmo que…

while (true) {
    ...
}

Nesse caso que você mostrou, envolve uma atribuição vinda de um cálculo certo? O parênteses (precedência) força o cálculo ser realizado primeiro e logo ser atribuído a variável c, após isso o valor de c é que será testado pelo while seguindo o que lhe falei acima, se o c é 0 dá false e o while vai parar, caso o contrário é true e o while continua calculando e testando… clareou um pouco mais? :joy:

1 curtida

Até onde sei não precisa parenteses nem em C nem em C++.

No mais, complementando sua resposta:

Em C++ (e até onde sei também em C) o resultado de uma atribuição é o valor que foi atribuído à variável, por exemplo:

x = 1;

Acima, o valor resultante dessa expressão de atribuição é o valor que foi armazenado em x, no caso 1. Isto é usado em coisas como atribuições encadeadas:

int z, y, x;
z = y = x = 1;

O valor de z, y e x será 1. Isto se dá porque a expressão é avaliada de direita para a esquerda

z = (y = (x = 1));

atribuindo 1 a x, e o operador = irá retornar o valor que foi atribuído a x, no caso 1. Logo após este 1 é atribuído a y e o resultado dessa atribuição é passado ao próximo operador que vai atribuir o valor de y (também 1) a z.

Em relação a usar isso dentro de um loop, em C++ o valor de uma condição é convertido implicitamente a bool. No caso inteiro diferente de zero será considerado true.

1 curtida

O código while ( ( c = c /t ) ) é interpretado sempre como verdadeiro e um loop infinito é criado.

Uma atribuição assume o valor “verdadeiro” como padrão quando usada no local de uma expressão lógica.

Isso não é “verdadeiro” rs. Mas serio, veja as respostas acima.