Aí tem duas operações:
a) A atribuição, que retorna o valor que foi atribuído;
b) A função em si;
Ainda usa duas peculiaridades do C: O valor 0 significa falso. E existe um caracter ao final de cada string, para dizer que ela acabou, que é justamente o \0.
Ou seja, suponha o seguinte programa:
int ind = 0;
char getNextChar(char* str) {
return str[ind++];
}
while (char ch = getNextChar("Olá enfermeira!")) {
printf("%s", ch);
}
O que esse programa faz:
O while chama o getNextChar, que retorna um caracter qualquer da String.
Esse caracter é atribuído à variável ch.
Como a atribuição retorna o que foi atribuído, esse valor também é retornado para o while.
Como qualquer caracter tem algum valor da tabela ascii, esse valor é interpretado como true.
A medida que a função avança, ela eventualmente chega ao final da string.
Chegando lá, o caracter encontrado é o \0
0 É atribuído a variável ch
0 é retornado ao while. Como 0 é false, o programa sai do while.
Rode num depurador e vc verá isso acontecendo.