int a=4, b=4*a;
przypisujesz: a:=4, b:=16
while(a=b)
w każdym kroku przypisujesz do a wartość b mówisz "wykonuj iterację dopóki warunek a=b jest prawdziwy (różny od zera), czyli właściwie mogłoby być while(b)
b-=a;
po pierwszej iteracji od b odejmujesz a. 16-16=0, więc drugiej iteracji nie będzie, bo warunek (a=b) nie jest prawdziwy (przypisujesz do a wartość b czyli 0, co "nie jest prawdziwe", false)
int b=5, a=4;
tego nie trzeba tłumaczyć
while(a=b>0)
w każdym kroku przypisujesz do a wartość b>0 czyli true, które jest rzutowane na int czyli 1. mówisz "wykonuj iterację dopóki warunek a=b>0 (czyli b>0) jest prawdziwy (różny od zera)
b-=a;
W każdej iteracji odejmujesz od b 1
Kolejne iteracje zmieniają tak wartości a i b:
a=1, b=4
a=1, b=3
a=1, b=2
a=1, b=1
a=1, b=0
#include <stdio.h>
void pierwsza(void)
{
int a=4, b=4*a;
printf("%s: przed petla: a=%d, b=%d\n", __func__, a, b);
while(a=b)
{
b-=a;
printf("%s: w petli: a=%d, b=%d\n", __func__, a, b);
}
printf("%s: po petli: a=%d, b=%d\n", __func__, a, b);
}
void druga(void)
{
int b=5, a=4;
printf("%s: przed petla: a=%d, b=%d\n", __func__, a, b);
while(a=b>0)
{
b-=a;
printf("%s: w petli: a=%d, b=%d\n", __func__, a, b);
}
printf("%s: po petli: a=%d, b=%d\n", __func__, a, b);
}
int main(void)
{
pierwsza();
druga();
return 0;
}
pierwsza: przed petla: a=4, b=16
pierwsza: w petli: a=16, b=0
pierwsza: po petli: a=0, b=0
druga: przed petla: a=4, b=5
druga: w petli: a=1, b=4
druga: w petli: a=1, b=3
druga: w petli: a=1, b=2
druga: w petli: a=1, b=1
druga: w petli: a=1, b=0
druga: po petli: a=0, b=0