Por que usar do 'while (0)'?

Usar um “do-while” loop com a condição sempre avaliada como falsa (0) pode parecer estranho à primeira vista, mas existem situações em que essa construção é útil.

Em linguagens de programação como C e C++, o uso comum do “do-while(0)” é em macros, principalmente para garantir que a macro se comporte como uma instrução única, mesmo quando ela é usada em contextos onde um bloco de instruções é esperado. Um exemplo disso é o uso de macros para facilitar o uso de código condicional sem a necessidade de chaves:

#define MIN(x, y) do { \
                    if (x < y)  \
                        printf("%d é menor\n", x); \
                    else \
                        printf("%d é menor\n", y); \
                } while (0)

Nesse caso, a macro MIN recebe dois números, compara-os e imprime uma mensagem dizendo qual é o menor. O uso do “do-while(0)” permite que a macro seja usada em um contexto onde um bloco de instruções é esperado, como em um “if” ou “else if”. Isso evita problemas de sintaxe, pois a macro é tratada como uma única instrução.

int main() {
    int a = 5, b = 3;

    if (a > b)
        MIN(a, b);
    else if (b > a)
        MIN(b, a);

    return 0;
}

No exemplo acima, a macro MIN é utilizada dentro de um “if” e dentro de um “else if”. Se não fosse pela construção do “do-while(0)”, o código não seria compilado, pois as chaves necessárias para definir um bloco de instruções já estariam sendo utilizadas pela macro.

Note que essa técnica também pode ser substituída por outras técnicas modernas, como o uso de funções inline ou lambdas, dependendo da linguagem de programação utilizada. É importante entender que o uso de “do-while(0)” em macros é uma técnica mais antiga, principalmente utilizada em códigos legados ou em situações específicas.